bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: fts: is an O_NOFOLLOW missing in fts_build / opendirat?


From: Paul Eggert
Subject: Re: fts: is an O_NOFOLLOW missing in fts_build / opendirat?
Date: Mon, 13 Sep 2010 10:01:00 -0700
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.12) Gecko/20100826 Thunderbird/3.0.7

On 09/13/10 01:02, Jim Meyering wrote:

> I ran this test: apply your patch, compile everything and
> run coreutils' "make check" tests.  With this change, 4 tests fail:
> 
>     $ grep FAIL tests/test-suite.log
>     FAIL: chgrp/posix-H (exit: 1)
>     FAIL: chgrp/recurse (exit: 1)
>     FAIL: du/deref (exit: 1)
>     FAIL: du/deref-args (exit: 1)

Good thing I said that patch was "untested" :-).  I just now tried the
patch on my RHEL 5 host, and got the du failures but not the chgrp
failures, I guess because the openattish support is somewhat limited
in RHEL 5?

> I haven't yet had time to look carefully, but those failures suggest that
> such a change would also have to account for the FTS_COMFOLLOW option,
> which may be set along with FTS_PHYSICAL.

Yes, that could be it.  I tried the following patch instead, and it
fixed the du failures on RHEL 5.  Maybe it will also fix the chgrp
failures on your host.  (I don't know offhand how to write a test case
that will catch the race condition bug that this patch fixes.)

diff --git a/lib/fts.c b/lib/fts.c
index 4b89ee7..1daf69c 100644
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -290,10 +290,11 @@ fts_set_stat_required (FTSENT *p, bool required)
 /* FIXME: if others need this function, move it into lib/openat.c */
 static inline DIR *
 internal_function
-opendirat (int fd, char const *dir)
+opendirat (int fd, char const *dir, int extra_flags)
 {
   int new_fd = openat (fd, dir,
-                       O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+                       (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
+                        | extra_flags));
   DIR *dirp;
 
   if (new_fd < 0)
@@ -1237,7 +1238,11 @@ fts_build (register FTS *sp, int type)
 #else
 # define __opendir2(file, flag) \
         ( ! ISSET(FTS_NOCHDIR) && ISSET(FTS_CWDFD) \
-          ? opendirat(sp->fts_cwd_fd, file)        \
+          ? opendirat(sp->fts_cwd_fd, file,        \
+                      ((ISSET(FTS_PHYSICAL)                   \
+                        && ! (cur->fts_level == FTS_ROOTLEVEL \
+                              && ISSET(FTS_COMFOLLOW)))       \
+                       ? O_NOFOLLOW : 0))                     \
           : opendir(file))
 #endif
        if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]