Your message dated Thu, 09 Nov 2023 20:34:45 +0000
with message-id <[email protected]>
and subject line Bug#1035531: fixed in coreutils 9.4-1
has caused the Debian Bug report #1035531,
regarding coreutils: fix regressions in copy dir-relative operations
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
1035531: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1035531
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: coreutils
Version: 9.1-1
Severity: important

There are regressions wrt how some directory-relative operations
performed by cp,mv,install as detailed in the following upstream reports:

 From https://bugs.gnu.org/55910
 From https://bugs.gnu.org/63245

These should be addressed by the attached patch,

Note this has already been applied to Fedora at:
https://src.fedoraproject.org/rpms/coreutils/raw/f38/f/coreutils-9.1-copy-relative-dir.patch
diff -Naur coreutils-9.1.orig/src/copy.c coreutils-9.1/src/copy.c
--- coreutils-9.1.orig/src/copy.c	2022-04-15 13:53:28.000000000 +0000
+++ coreutils-9.1/src/copy.c	2023-05-04 21:09:46.290253081 +0000
@@ -1954,6 +1954,7 @@
   bool restore_dst_mode = false;
   char *earlier_file = NULL;
   char *dst_backup = NULL;
+  char const *drelname = *dst_relname ? dst_relname : ".";
   bool delayed_ok;
   bool copied_as_regular = false;
   bool dest_is_symlink = false;
@@ -1971,7 +1972,7 @@
   if (x->move_mode)
     {
       if (rename_errno < 0)
-        rename_errno = (renameatu (AT_FDCWD, src_name, dst_dirfd, dst_relname,
+        rename_errno = (renameatu (AT_FDCWD, src_name, dst_dirfd, drelname,
                                    RENAME_NOREPLACE)
                         ? errno : 0);
       nonexistent_dst = *rename_succeeded = new_dst = rename_errno == 0;
@@ -1983,7 +1984,7 @@
     {
       char const *name = rename_errno == 0 ? dst_name : src_name;
       int dirfd = rename_errno == 0 ? dst_dirfd : AT_FDCWD;
-      char const *relname = rename_errno == 0 ? dst_relname : src_name;
+      char const *relname = rename_errno == 0 ? drelname : src_name;
       int fstatat_flags
         = x->dereference == DEREF_NEVER ? AT_SYMLINK_NOFOLLOW : 0;
       if (follow_fstatat (dirfd, relname, &src_sb, fstatat_flags) != 0)
@@ -2051,8 +2052,7 @@
           int fstatat_flags = use_lstat ? AT_SYMLINK_NOFOLLOW : 0;
           if (!use_lstat && nonexistent_dst < 0)
             new_dst = true;
-          else if (follow_fstatat (dst_dirfd, dst_relname, &dst_sb,
-                                   fstatat_flags)
+          else if (follow_fstatat (dst_dirfd, drelname, &dst_sb, fstatat_flags)
                    == 0)
             {
               have_dst_lstat = use_lstat;
@@ -2077,7 +2077,7 @@
           bool return_now = false;
 
           if (x->interactive != I_ALWAYS_NO
-              && ! same_file_ok (src_name, &src_sb, dst_dirfd, dst_relname,
+              && ! same_file_ok (src_name, &src_sb, dst_dirfd, drelname,
                                  &dst_sb, x, &return_now))
             {
               error (0, 0, _("%s and %s are the same file"),
@@ -2140,7 +2140,7 @@
              cp and mv treat -i and -f differently.  */
           if (x->move_mode)
             {
-              if (abandon_move (x, dst_name, dst_dirfd, dst_relname, &dst_sb))
+              if (abandon_move (x, dst_name, dst_dirfd, drelname, &dst_sb))
                 {
                   /* Pretend the rename succeeded, so the caller (mv)
                      doesn't end up removing the source file.  */
@@ -2321,14 +2321,11 @@
          Otherwise, use AT_SYMLINK_NOFOLLOW, in case dst_name is a symlink.  */
       if (have_dst_lstat)
         dst_lstat_sb = &dst_sb;
+      else if (fstatat (dst_dirfd, drelname, &tmp_buf, AT_SYMLINK_NOFOLLOW)
+               == 0)
+        dst_lstat_sb = &tmp_buf;
       else
-        {
-          if (fstatat (dst_dirfd, dst_relname, &tmp_buf,
-                       AT_SYMLINK_NOFOLLOW) == 0)
-            dst_lstat_sb = &tmp_buf;
-          else
-            lstat_ok = false;
-        }
+        lstat_ok = false;
 
       /* Never copy through a symlink we've just created.  */
       if (lstat_ok
@@ -2475,8 +2472,7 @@
   if (x->move_mode)
     {
       if (rename_errno == EEXIST)
-        rename_errno = ((renameat (AT_FDCWD, src_name, dst_dirfd, dst_relname)
-                         == 0)
+        rename_errno = (renameat (AT_FDCWD, src_name, dst_dirfd, drelname) == 0
                         ? 0 : errno);
 
       if (rename_errno == 0)
@@ -2576,7 +2572,7 @@
          or not, and this is enforced above.  Therefore we check the src_mode
          and operate on dst_name here as a tighter constraint and also because
          src_mode is readily available here.  */
-      if ((unlinkat (dst_dirfd, dst_relname,
+      if ((unlinkat (dst_dirfd, drelname,
                      S_ISDIR (src_mode) ? AT_REMOVEDIR : 0)
            != 0)
           && errno != ENOENT)
@@ -2646,7 +2642,7 @@
              to ask mkdir to copy all the CHMOD_MODE_BITS, letting mkdir
              decide what to do with S_ISUID | S_ISGID | S_ISVTX.  */
           mode_t mode = dst_mode_bits & ~omitted_permissions;
-          if (mkdirat (dst_dirfd, dst_relname, mode) != 0)
+          if (mkdirat (dst_dirfd, drelname, mode) != 0)
             {
               error (0, errno, _("cannot create directory %s"),
                      quoteaf (dst_name));
@@ -2657,8 +2653,7 @@
              for writing the directory's contents. Check if these
              permissions are there.  */
 
-          if (fstatat (dst_dirfd, dst_relname, &dst_sb,
-                       AT_SYMLINK_NOFOLLOW) != 0)
+          if (fstatat (dst_dirfd, drelname, &dst_sb, AT_SYMLINK_NOFOLLOW) != 0)
             {
               error (0, errno, _("cannot stat %s"), quoteaf (dst_name));
               goto un_backup;
@@ -2670,7 +2665,7 @@
               dst_mode = dst_sb.st_mode;
               restore_dst_mode = true;
 
-              if (lchmodat (dst_dirfd, dst_relname, dst_mode | S_IRWXU) != 0)
+              if (lchmodat (dst_dirfd, drelname, dst_mode | S_IRWXU) != 0)
                 {
                   error (0, errno, _("setting permissions for %s"),
                          quoteaf (dst_name));
@@ -2924,7 +2919,7 @@
       /* Now that the destination file is very likely to exist,
          add its info to the set.  */
       struct stat sb;
-      if (fstatat (dst_dirfd, dst_relname, &sb, AT_SYMLINK_NOFOLLOW) == 0)
+      if (fstatat (dst_dirfd, drelname, &sb, AT_SYMLINK_NOFOLLOW) == 0)
         record_file (x->dest_info, dst_relname, &sb);
     }
 
@@ -2957,7 +2952,7 @@
       timespec[1] = get_stat_mtime (&src_sb);
 
       int utimensat_flags = dest_is_symlink ? AT_SYMLINK_NOFOLLOW : 0;
-      if (utimensat (dst_dirfd, dst_relname, timespec, utimensat_flags) != 0)
+      if (utimensat (dst_dirfd, drelname, timespec, utimensat_flags) != 0)
         {
           error (0, errno, _("preserving times for %s"), quoteaf (dst_name));
           if (x->require_preserve)
@@ -2969,7 +2964,7 @@
   if (!dest_is_symlink && x->preserve_ownership
       && (new_dst || !SAME_OWNER_AND_GROUP (src_sb, dst_sb)))
     {
-      switch (set_owner (x, dst_name, dst_dirfd, dst_relname, -1,
+      switch (set_owner (x, dst_name, dst_dirfd, drelname, -1,
                          &src_sb, new_dst, &dst_sb))
         {
         case -1:
@@ -3024,8 +3019,9 @@
                  the lstat, but deducing the current destination mode
                  is tricky in the presence of implementation-defined
                  rules for special mode bits.  */
-              if (new_dst && fstatat (dst_dirfd, dst_relname, &dst_sb,
-                                     AT_SYMLINK_NOFOLLOW) != 0)
+              if (new_dst && (fstatat (dst_dirfd, drelname, &dst_sb,
+                                       AT_SYMLINK_NOFOLLOW)
+                              != 0))
                 {
                   error (0, errno, _("cannot stat %s"), quoteaf (dst_name));
                   return false;
@@ -3038,7 +3034,7 @@
 
       if (restore_dst_mode)
         {
-          if (lchmodat (dst_dirfd, dst_relname, dst_mode | omitted_permissions)
+          if (lchmodat (dst_dirfd, drelname, dst_mode | omitted_permissions)
               != 0)
             {
               error (0, errno, _("preserving permissions for %s"),
@@ -3068,7 +3064,7 @@
   if (dst_backup)
     {
       char const *dst_relbackup = &dst_backup[dst_relname - dst_name];
-      if (renameat (dst_dirfd, dst_relbackup, dst_dirfd, dst_relname) != 0)
+      if (renameat (dst_dirfd, dst_relbackup, dst_dirfd, drelname) != 0)
         error (0, errno, _("cannot un-backup %s"), quoteaf (dst_name));
       else
         {
diff -Naur coreutils-9.1.orig/src/cp.c coreutils-9.1/src/cp.c
--- coreutils-9.1.orig/src/cp.c	2023-05-04 21:08:46.747627135 +0000
+++ coreutils-9.1/src/cp.c	2023-05-04 21:09:50.067286480 +0000
@@ -273,15 +273,19 @@
    when done.  */
 
 static bool
-re_protect (char const *const_dst_name, int dst_dirfd, char const *dst_relname,
+re_protect (char const *const_dst_name, int dst_dirfd, char const *dst_fullname,
             struct dir_attr *attr_list, const struct cp_options *x)
 {
   struct dir_attr *p;
   char *dst_name;		/* A copy of CONST_DST_NAME we can change. */
-  char *src_name;		/* The source name in 'dst_name'. */
+  char *src_name;		/* The relative source name in 'dst_name'. */
+  char *full_src_name;		/* The full source name in 'dst_name'. */
 
   ASSIGN_STRDUPA (dst_name, const_dst_name);
-  src_name = dst_name + (dst_relname - const_dst_name);
+  full_src_name = dst_name + (dst_fullname - const_dst_name);
+  src_name = full_src_name;
+  while (*src_name == '/')
+    src_name++;
 
   for (p = attr_list; p; p = p->next)
     {
@@ -324,7 +328,7 @@
 
       if (x->preserve_mode)
         {
-          if (copy_acl (src_name, -1, dst_name, -1, p->st.st_mode) != 0)
+          if (copy_acl (full_src_name, -1, dst_name, -1, p->st.st_mode) != 0)
             return false;
         }
       else if (p->restore_mode)
@@ -664,6 +668,7 @@
           bool parent_exists = true;  /* True if dir_name (dst_name) exists. */
           struct dir_attr *attr_list;
           char *arg_in_concat = NULL;
+          char *full_arg_in_concat = NULL;
           char *arg = file[i];
 
           /* Trailing slashes are meaningful (i.e., maybe worth preserving)
@@ -696,6 +701,7 @@
                   (x->verbose ? "%s -> %s\n" : NULL),
                   &attr_list, &new_dst, x));
 
+              full_arg_in_concat = arg_in_concat;
               while (*arg_in_concat == '/')
                 arg_in_concat++;
             }
@@ -724,7 +730,7 @@
                           new_dst, x, &copy_into_self, NULL);
 
               if (parents_option)
-                ok &= re_protect (dst_name, target_dirfd, arg_in_concat,
+                ok &= re_protect (dst_name, target_dirfd, full_arg_in_concat,
                                   attr_list, x);
             }
 
diff -Naur coreutils-9.1.orig/tests/cp/cp-parents.sh coreutils-9.1/tests/cp/cp-parents.sh
--- coreutils-9.1.orig/tests/cp/cp-parents.sh	2022-04-08 11:22:18.000000000 +0000
+++ coreutils-9.1/tests/cp/cp-parents.sh	2023-05-04 21:09:50.067286480 +0000
@@ -66,4 +66,10 @@
 cp --parents --no-preserve=mode np/b/file np_dest/ || fail=1
 p=$(ls -ld np_dest/np|cut -b-10); case $p in drwxr-xr-x);; *) fail=1;; esac
 
+# coreutils 9.1-9.3 inclusive would fail to copy acls for absolute dirs
+mkdir dest || framework_failure_
+if test -f /bin/ls; then
+  cp -t dest --parents -p /bin/ls || fail=1
+fi
+
 Exit $fail

--- End Message ---
--- Begin Message ---
Source: coreutils
Source-Version: 9.4-1
Done: Michael Stone <[email protected]>

We believe that the bug you reported is fixed in the latest version of
coreutils, which is due to be installed in the Debian FTP archive.

A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Michael Stone <[email protected]> (supplier of updated coreutils package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Format: 1.8
Date: Thu, 09 Nov 2023 14:18:41 -0500
Source: coreutils
Binary: coreutils coreutils-dbgsym
Architecture: source amd64
Version: 9.4-1
Distribution: unstable
Urgency: low
Maintainer: Michael Stone <[email protected]>
Changed-By: Michael Stone <[email protected]>
Description:
 coreutils  - GNU core utilities
Closes: 1017354 1035530 1035531 1037264
Changes:
 coreutils (9.4-1) unstable; urgency=low
 .
   * New upstream version (Closes: #1017354)
     - corrects cksum crashes due to missing cpu features (Closes: #1037264)
     - corrects copy dir-relative operations (Closes: #1035531)
     - corrects copy backup operations (Closes: #1035530)
   * Drop old 61_whoips.patch and who --ips option; it no longer applies
     cleanly after who.c refactoring, and it isn't clear the patch is still
     useful given how system logging has changed since the patch was written
   * Drop 63_dd-appenderrors.patch as documentation has been updated for ages
   * Update copyright file
Checksums-Sha1:
 ba3ac018cfaf520c44647254f4f0f5ff2b6ccb61 1848 coreutils_9.4-1.dsc
 7effa305c3f4bc0d40d79f1854515ebf5f688a18 5979200 coreutils_9.4.orig.tar.xz
 bc483c15ccc01157ba101ff09fd387f1db2b4894 29148 coreutils_9.4-1.debian.tar.xz
 8815491707c10ee92ca04236c291738e5a3b1b84 7095016 
coreutils-dbgsym_9.4-1_amd64.deb
 e1064a6883870c1e6b1a94dae51f8a22e798e7b2 8243 coreutils_9.4-1_amd64.buildinfo
 98530b6a08d3a2bc9126f7336faf0a03923a1c64 2968648 coreutils_9.4-1_amd64.deb
Checksums-Sha256:
 f26318ab8c1b5092a5a3805bf2e19b2be738595c36281bd9d09f8e427ec8e1af 1848 
coreutils_9.4-1.dsc
 ea613a4cf44612326e917201bbbcdfbd301de21ffc3b59b6e5c07e040b275e52 5979200 
coreutils_9.4.orig.tar.xz
 39983e0abd57f2671004055d37178e0eaa04d3f7d2269631a27d04880b717d8b 29148 
coreutils_9.4-1.debian.tar.xz
 cbcdeba967a77c13beacc434baa9e4bf06ce167c704d567ca47b07808f16a9b2 7095016 
coreutils-dbgsym_9.4-1_amd64.deb
 22a9080eabedd6b65b4948cde9abe9db1c6df744d3eaf8d1d3abfc99e8cff254 8243 
coreutils_9.4-1_amd64.buildinfo
 82d92e6c1a4f040acad59179e869b02b2742c204e8466ef8e6a7a3851af1be6f 2968648 
coreutils_9.4-1_amd64.deb
Files:
 05fb7b07e10d5b46643310e4121178ca 1848 utils required coreutils_9.4-1.dsc
 459e9546074db2834eefe5421f250025 5979200 utils required 
coreutils_9.4.orig.tar.xz
 eb152b9a7934bdf7140d7f3b5df3f834 29148 utils required 
coreutils_9.4-1.debian.tar.xz
 b9f86f551d530235a9ed8ac37d40e61a 7095016 debug optional 
coreutils-dbgsym_9.4-1_amd64.deb
 397be867f510ec95dd5971c48c870414 8243 utils required 
coreutils_9.4-1_amd64.buildinfo
 7cb96cf73c3baf070507ba37e3fc7188 2968648 utils required 
coreutils_9.4-1_amd64.deb

-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEAtUxX/EfGGGGDh4C9hqs3PoR/94FAmVNN0QACgkQ9hqs3PoR
/95+ZA/+MImWwOdWsFH+zRUxmLT9fyv6mHk4GOFZHxLIl+1iZNR/ILi7C7cl2GJG
04Jy+zN1MlofhSm9NxnUaq/6Vq2EhfFxqHG/ETV31h7ycTb+/E7E9dkC10ALBhEW
5yS9D4hhJPkt02dQcP907vGLUH/WFFoI1CrKdKuunElJNZnmSaNr3kJ32IUkRgtF
eAYBe89yJoNgnhc1SMTN8WUMN+0TP/zKeq/+eUXhc58cI5paf7K24xy51pN5wLfE
WrRO2GFaFzo0xh0Zt8Am7kM8NYrtqqtga+NGYpbeBtJfZVQ9+vyc+s4X/m3DkI50
ZSimOjFjr9bDqMbU/em2P+H76airovM7EVD9RJuKUrclokAhbdjAvoPU0Q7Lr9ca
amlFiT5C6l2h5bAI1diKHc6NDiyodaFVWpP7ZVul35SuM6hzj//zWEpRYTtEBJnh
z84/MkGtScrpLvjQ7lCl/mEjx8fihxXpDDE5QpzjSoKjldC3BCk3qM7J+Flb7pq7
+wbMibTsZ17zLH+RqbabUIzICLqF+PNE4w5AMtA4KERTwBvQq6pRHymTWmKzki7C
6yUd7o94IgWXnnNRGE/mEMk9v8hehdzb+/UsGVfB801Bi0e0BeGdvoZTFOuEIB/q
PxXoEJbvUb5r7RJBJ6vOQWccXSxulR/1eIxhgKEckqIAHdRxHAs=
=fLg+
-----END PGP SIGNATURE-----

--- End Message ---

Reply via email to