Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Apr 2015 13:28:32 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r281741 - stable/10/lib/libc/gen
Message-ID:  <201504191328.t3JDSWYD078354@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504191328.t3JDSWYD078354>