diff options
| author | Kris Kennaway <kris@FreeBSD.org> | 2001-05-30 20:35:44 +0000 |
|---|---|---|
| committer | Kris Kennaway <kris@FreeBSD.org> | 2001-05-30 20:35:44 +0000 |
| commit | fdeb0156dd27c7314c85f1eedf3e10a55cae4735 (patch) | |
| tree | ae56f197ecc76ecc6eb898fb1d2ffc57d8dc7a83 /lib/libc | |
| parent | f8fb1acb36e6d34a13a6babdf585c18c6de2e16f (diff) | |
Notes
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/gen/fts-compat.c | 18 | ||||
| -rw-r--r-- | lib/libc/gen/fts.c | 18 |
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; |
