]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cp: with --no-preserve=mode ensure set-group-ID bits maintained on dirs
authorPádraig Brady <P@draigBrady.com>
Mon, 25 Mar 2024 22:17:35 +0000 (22:17 +0000)
committerPádraig Brady <P@draigBrady.com>
Mon, 25 Mar 2024 22:27:15 +0000 (22:27 +0000)
This issue was introduced in commit v8.19-145-g24ebca6

* src/copy.c (copy_internal): On systems that don't support ACLs,
the fallback default chmod done on directories should maintain
the set-group-ID, as that's generally auto-set by the system.
* NEWS: Mention the fix.
Reported by Bruno Haible on Alpine (with tests/cp/preserve-mode.sh)

NEWS
src/copy.c

diff --git a/NEWS b/NEWS
index a6ec7c6ef9b0c4027f3c7ce0d70879732daa8850..872723e4fe1eebf24cfb389b6ba11940c17ca54c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,11 @@ GNU coreutils NEWS                                    -*- outline -*-
   to preserve ownership" when copying to GNU/Linux CIFS file systems.
   They do this by working around some Linux CIFS bugs.
 
+  cp --no-preserve=mode will correctly maintain set-group-ID bits
+  for created directories.  Previously on systems that didn't support ACLs,
+  cp would have reset the set-group-ID bit on created directories.
+  [bug introduced in coreutils-8.20]
+
   join and uniq now support multi-byte characters better.
   For example, 'join -tX' now works even if X is a multi-byte character,
   and both programs now treat multi-byte characters like U+3000
index 0318e0067c4d33e876630fe4bbfe326715e6ae38..d584a27eb5acda5ba76209218fc97ad6362ffd2e 100644 (file)
@@ -3268,6 +3268,9 @@ skip:
     {
       int default_permissions = S_ISDIR (src_mode) || S_ISSOCK (src_mode)
                                 ? S_IRWXUGO : MODE_RW_UGO;
+      dst_mode = dst_sb.st_mode;
+      if (S_ISDIR (src_mode))  /* Keep set-group-ID for directories.  */
+        default_permissions |= (dst_mode & S_ISGID);
       if (set_acl (dst_name, -1, default_permissions & ~cached_umask ()) != 0)
         return false;
     }