svn commit: r281741 - stable/10/lib/libc/gen
Jilles Tjoelker
jilles at FreeBSD.org
Sun Apr 19 13:28:33 UTC 2015
Author: jilles
Date: Sun Apr 19 13:28:32 2015
New Revision: 281741
URL: https://svnweb.freebsd.org/changeset/base/281741
Log:
MFC r281082: fts: Don't return FTS_SLNONE if it's not a symlink (if race).
When following symlinks, fts returned FTS_SLNONE when fstatat(flag=0)
failed, but a subsequent fstatat(flag=AT_SYMLINK_NOFOLLOW) succeeded. This
incorrectly triggered if a filename existed to be read from the directory,
was deleted before the fstatat(flag=0) and created again after the
fstatat(flag=0).
Fix this by only returning FTS_SLNONE if the result from
fstatat(flag=AT_SYMLINK_NOFOLLOW) is actually a symlink. If it is not a
symlink, treat it as if fstatat(flag=0) succeeded.
PR: 196724
Modified:
stable/10/lib/libc/gen/fts.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/lib/libc/gen/fts.c
==============================================================================
--- stable/10/lib/libc/gen/fts.c Sun Apr 19 12:49:30 2015 (r281740)
+++ stable/10/lib/libc/gen/fts.c Sun Apr 19 13:28:32 2015 (r281741)
@@ -905,12 +905,13 @@ fts_stat(FTS *sp, FTSENT *p, int follow,
if (ISSET(FTS_LOGICAL) || follow) {
if (fstatat(dfd, path, sbp, 0)) {
saved_errno = errno;
- if (!fstatat(dfd, path, sbp, AT_SYMLINK_NOFOLLOW)) {
- errno = 0;
- return (FTS_SLNONE);
+ if (fstatat(dfd, path, sbp, AT_SYMLINK_NOFOLLOW)) {
+ p->fts_errno = saved_errno;
+ goto err;
}
- p->fts_errno = saved_errno;
- goto err;
+ errno = 0;
+ if (S_ISLNK(sbp->st_mode))
+ return (FTS_SLNONE);
}
} else if (fstatat(dfd, path, sbp, AT_SYMLINK_NOFOLLOW)) {
p->fts_errno = errno;
More information about the svn-src-stable-10
mailing list