Change directory permissions in pre-order.
In this order, it won't try to recurse into a directory for which
it doesn't have permission, before changing that permission.
This follows the existing behavior in other BSDs, linux, OS X.

Obtained from:  NetBSD
Found by:       while digging in buildbot sources
Index: chmod.c
--- chmod.c     (revision 283969)
+++ chmod.c     (working copy)
@@ -162,14 +162,16 @@
                        atflag = AT_SYMLINK_NOFOLLOW;
                switch (p->fts_info) {
-               case FTS_D:                     /* Change it at FTS_DP. */
+               case FTS_D:
                        if (!Rflag)
                                fts_set(ftsp, p, FTS_SKIP);
-                       continue;
+                       break;
                case FTS_DNR:                   /* Warn, chmod. */
                        warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
                        rval = 1;
+               case FTS_DP:                    /* Already changed at FTS_D. */
+                       continue;
                case FTS_ERR:                   /* Warn, continue. */
                case FTS_NS:
                        warnx("%s: %s", p->fts_path, strerror(p->fts_errno));

Attachment: pgptCFc3Bf3nt.pgp
Description: PGP signature

Reply via email to