Chmod used to incorrectly report as changed even files for which the
mode did not change. This was caused by extra bits in the st_mode, that
were not present when parsed from passed argument in the form of octal
number.
---
Before the patch:

+$ mkdir /tmp/q
+$ busybox chmod -c 0600 /tmp/q
mode of '/tmp/q' changed to 0600 (rw-------)
+$ busybox chmod -c 0600 /tmp/q
mode of '/tmp/q' changed to 0600 (rw-------)

After the patch:

+$ mkdir /tmp/r
+$ ./busybox chmod -c 0600 /tmp/r
mode of '/tmp/r' changed to 0600 (rw-------)
+$ ./busybox chmod -c 0600 /tmp/r

I also took the liberty of changing the non-protable 07777 used in the
printf to the MODE_BITS define introduced in this commit. I can send v2
without it if it's not desirable.

 coreutils/chmod.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/coreutils/chmod.c b/coreutils/chmod.c
index e260adab2..3b11538c3 100644
--- a/coreutils/chmod.c
+++ b/coreutils/chmod.c
@@ -57,6 +57,8 @@
 #define OPT_QUIET   (IF_DESKTOP(option_mask32 & 8) IF_NOT_DESKTOP(0))
 #define OPT_STR     "R" IF_DESKTOP("vcf")
 
+#define MODE_BITS (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
+
 /* coreutils:
  * chmod never changes the permissions of symbolic links; the chmod
  * system call cannot change their permissions. This is not a problem
@@ -88,10 +90,11 @@ static int FAST_FUNC fileAction(struct recursive_state 
*state,
 
        if (chmod(fileName, newmode) == 0) {
                if (OPT_VERBOSE
-                || (OPT_CHANGED && statbuf->st_mode != newmode)
+                || (OPT_CHANGED
+                       && (statbuf->st_mode & MODE_BITS) != (newmode & 
MODE_BITS))
                ) {
                        printf("mode of '%s' changed to %04o (%s)\n", fileName,
-                               newmode & 07777, bb_mode_string(newmode)+1);
+                               newmode & MODE_BITS, bb_mode_string(newmode)+1);
                }
                return TRUE;
        }
-- 
2.33.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to