Fix the 2006-09-18 bug differently.
authorJim Meyering <jim@meyering.net>
Wed, 20 Sep 2006 11:50:46 +0000 (11:50 +0000)
committerJim Meyering <jim@meyering.net>
Wed, 20 Sep 2006 11:50:46 +0000 (11:50 +0000)
* src/chmod.c: (process_file): Upon FTS_NS for a top-level file,
tell fts_read to stat the file again, in case it has become
accessible since the initial fts_open call.
* src/chown-core.c (change_file_owner): Likewise.

ChangeLog
src/chmod.c
src/chown-core.c

index 75405e18c7693477269c549423845d8df9796064..7d62c4d510f3f73e0a4fe06b2168f12b8aff60dc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2006-09-20  Jim Meyering  <jim@meyering.net>
 
+       Fix the 2006-09-18 bug differently.
+       * src/chmod.c: (process_file): Upon FTS_NS for a top-level file,
+       tell fts_read to stat the file again, in case it has become
+       accessible since the initial fts_open call.
+       * src/chown-core.c (change_file_owner): Likewise.
+
        * src/chmod.c: Revert last change.  There is a better way.
        * src/chown-core.c: Likewise.
 
index 29611366c9f39378c4350fbf1ebe72ba4cab23d3..7858c0a66123c670fbd7f2dbaa72aac9540f4aff 100644 (file)
@@ -193,6 +193,19 @@ process_file (FTS *fts, FTSENT *ent)
       return true;
 
     case FTS_NS:
+      /* For a top-level file or directory, this FTS_NS (stat failed)
+        indicator is determined at the time of the initial fts_open call.
+        With programs like chmod, chown, and chgrp, that modify
+        permissions, it is possible that the file in question is
+        accessible when control reaches this point.  So, if this is
+        the first time we've seen the FTS_NS for this file, tell
+        fts_read to stat it "again".  */
+      if (ent->fts_level == 0 && ent->fts_number == 0)
+       {
+         ent->fts_number = 1;
+         fts_set (fts, ent, FTS_AGAIN);
+         return true;
+       }
       error (0, ent->fts_errno, _("cannot access %s"), quote (file_full_name));
       ok = false;
       break;
index 39cb34d8b38713e9920c8a22662efd72d2b54172..dbd3e52d8c3cd9cb7865a1de668fa86c7698d293 100644 (file)
@@ -267,6 +267,19 @@ change_file_owner (FTS *fts, FTSENT *ent,
       break;
 
     case FTS_NS:
+      /* For a top-level file or directory, this FTS_NS (stat failed)
+        indicator is determined at the time of the initial fts_open call.
+        With programs like chmod, chown, and chgrp, that modify
+        permissions, it is possible that the file in question is
+        accessible when control reaches this point.  So, if this is
+        the first time we've seen the FTS_NS for this file, tell
+        fts_read to stat it "again".  */
+      if (ent->fts_level == 0 && ent->fts_number == 0)
+       {
+         ent->fts_number = 1;
+         fts_set (fts, ent, FTS_AGAIN);
+         return true;
+       }
       error (0, ent->fts_errno, _("cannot access %s"), quote (file_full_name));
       ok = false;
       break;