summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authorKris Kennaway <kris@FreeBSD.org>2001-05-30 20:35:44 +0000
committerKris Kennaway <kris@FreeBSD.org>2001-05-30 20:35:44 +0000
commitfdeb0156dd27c7314c85f1eedf3e10a55cae4735 (patch)
treeae56f197ecc76ecc6eb898fb1d2ffc57d8dc7a83 /lib/libc
parentf8fb1acb36e6d34a13a6babdf585c18c6de2e16f (diff)
Notes
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/gen/fts-compat.c18
-rw-r--r--lib/libc/gen/fts.c18
2 files changed, 32 insertions, 4 deletions
diff --git a/lib/libc/gen/fts-compat.c b/lib/libc/gen/fts-compat.c
index c6b09ffaac5c..72e0c4df6790 100644
--- a/lib/libc/gen/fts-compat.c
+++ b/lib/libc/gen/fts-compat.c
@@ -44,6 +44,7 @@ static char rcsid[] = "$FreeBSD$";
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
+#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
@@ -278,6 +279,7 @@ fts_read(sp)
register FTS *sp;
{
register FTSENT *p, *tmp;
+ struct stat sb;
register int instr;
register char *t;
int saved_errno;
@@ -451,10 +453,22 @@ name: t = sp->fts_path + NAPPEND(p->fts_parent);
return (NULL);
}
(void)_close(p->fts_symfd);
- } else if (!(p->fts_flags & FTS_DONTCHDIR)) {
- if (CHDIR(sp, "..")) {
+ } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+ !ISSET(FTS_NOCHDIR)) {
+ if (chdir("..")) {
+ SET(FTS_STOP);
+ return (NULL);
+ }
+ if (stat(".", &sb) == -1) {
SET(FTS_STOP);
return (NULL);
+ } else {
+ if (sb.st_ino != p->fts_parent->fts_ino ||
+ sb.st_dev != p->fts_parent->fts_dev) {
+ errno = ENOENT;
+ SET(FTS_STOP);
+ return (NULL);
+ }
}
}
p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c
index c6b09ffaac5c..72e0c4df6790 100644
--- a/lib/libc/gen/fts.c
+++ b/lib/libc/gen/fts.c
@@ -44,6 +44,7 @@ static char rcsid[] = "$FreeBSD$";
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
+#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
@@ -278,6 +279,7 @@ fts_read(sp)
register FTS *sp;
{
register FTSENT *p, *tmp;
+ struct stat sb;
register int instr;
register char *t;
int saved_errno;
@@ -451,10 +453,22 @@ name: t = sp->fts_path + NAPPEND(p->fts_parent);
return (NULL);
}
(void)_close(p->fts_symfd);
- } else if (!(p->fts_flags & FTS_DONTCHDIR)) {
- if (CHDIR(sp, "..")) {
+ } else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+ !ISSET(FTS_NOCHDIR)) {
+ if (chdir("..")) {
+ SET(FTS_STOP);
+ return (NULL);
+ }
+ if (stat(".", &sb) == -1) {
SET(FTS_STOP);
return (NULL);
+ } else {
+ if (sb.st_ino != p->fts_parent->fts_ino ||
+ sb.st_dev != p->fts_parent->fts_dev) {
+ errno = ENOENT;
+ SET(FTS_STOP);
+ return (NULL);
+ }
}
}
p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;