[PATCH] Fix ftw

Jakub Jelinek jakub@redhat.com
Thu Mar 2 15:53:00 GMT 2006


Hi!

If dir->streamfd != -1 and
FXSTATAT (_STAT_VER, dir->streamfd, name, &st, 0);
fails with EACCESS or ENOENT, then ftw is supposed to
find out if that is because of a dead symlink or for some
other reason.  If d_type is DT_LNK, then no further
work is needed, however otherwise we were calling LXSTAT.
But name in this case is relative to dir->streamfd, not absolute
or relative to current working directory, so it tells us something
different from what we are looking for.
The following patch fixes it (tested on s390x where ftwtest failed
because of this).

2006-03-02  Jakub Jelinek  <jakub@redhat.com>

	* io/ftw.c (process_entry): If dir->streamfd != -1,
	use FXSTATAT rather than LXSTAT to find if unstatable
	file is a dead symlink.

--- libc/io/ftw.c.jj	2006-02-12 16:40:36.000000000 -0500
+++ libc/io/ftw.c	2006-03-02 10:37:41.000000000 -0500
@@ -419,13 +419,22 @@ process_entry (struct ftw_data *data, st
     {
       if (errno != EACCES && errno != ENOENT)
 	result = -1;
-      else if (!(data->flags & FTW_PHYS)
-	       && (d_type == DT_LNK
-		   || (LXSTAT (_STAT_VER, name, &st) == 0
-		       && S_ISLNK (st.st_mode))))
+      else if (data->flags & FTW_PHYS)
+	flag = FTW_NS;
+      else if (d_type == DT_LNK)
 	flag = FTW_SLN;
       else
-	flag = FTW_NS;
+	{
+	  if (dir->streamfd != -1)
+	    statres = FXSTATAT (_STAT_VER, dir->streamfd, name, &st,
+				AT_SYMLINK_NOFOLLOW);
+	  else
+	    statres = LXSTAT (_STAT_VER, name, &st);
+	  if (statres == 0 && S_ISLNK (st.st_mode))
+	    flag = FTW_SLN;
+	  else
+	    flag = FTW_NS;
+	}
     }
   else
     {

	Jakub



More information about the Libc-hacker mailing list