Package: coreutils
Version: 9.1-1
Severity: important

There are regressions wrt how backups are performed by cp,mv,install
as detailed in the following upstream reports:

From https://bugs.gnu.org/55029
From https://bugs.gnu.org/62607

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/gnulib-simple-backup-fix.patch
diff -Naur coreutils-9.1.orig/lib/backupfile.c coreutils-9.1/lib/backupfile.c
--- coreutils-9.1.orig/lib/backupfile.c	2022-04-08 11:22:26.000000000 +0000
+++ coreutils-9.1/lib/backupfile.c	2023-05-04 17:07:20.784911071 +0000
@@ -332,7 +332,7 @@
     return s;
 
   DIR *dirp = NULL;
-  int sdir = AT_FDCWD;
+  int sdir = -1;
   idx_t base_max = 0;
   while (true)
     {
@@ -371,10 +371,10 @@
       if (! rename)
         break;
 
-      int olddirfd = sdir < 0 ? dir_fd : sdir;
+      dir_fd = sdir < 0 ? dir_fd : sdir;
       idx_t offset = sdir < 0 ? 0 : base_offset;
       unsigned flags = backup_type == simple_backups ? 0 : RENAME_NOREPLACE;
-      if (renameatu (olddirfd, file + offset, sdir, s + offset, flags) == 0)
+      if (renameatu (dir_fd, file + offset, dir_fd, s + offset, flags) == 0)
         break;
       int e = errno;
       if (! (e == EEXIST && extended))
diff -Naur coreutils-9.1.orig/tests/cp/backup-dir.sh coreutils-9.1/tests/cp/backup-dir.sh
--- coreutils-9.1.orig/tests/cp/backup-dir.sh	2022-04-08 11:22:18.000000000 +0000
+++ coreutils-9.1/tests/cp/backup-dir.sh	2023-05-04 17:07:24.851960384 +0000
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Ensure that cp -b doesn't back up directories.
+# Ensure that cp -b handles directories appropriately
 
 # Copyright (C) 2006-2022 Free Software Foundation, Inc.
 
@@ -29,4 +29,10 @@
 test -d y/x || fail=1
 test -d y/x~ && fail=1
 
+# Bug 62607.
+# This would fail to backup using rename, and thus fail to replace the file
+mkdir -p src/foo dst/foo || framework_failure_
+touch src/foo/bar dst/foo/bar || framework_failure_
+cp --recursive --backup src/* dst || fail=1
+
 Exit $fail
diff -Naur coreutils-9.1.orig/tests/mv/backup-dir.sh coreutils-9.1/tests/mv/backup-dir.sh
--- coreutils-9.1.orig/tests/mv/backup-dir.sh	2022-04-08 11:22:18.000000000 +0000
+++ coreutils-9.1/tests/mv/backup-dir.sh	2023-05-04 17:03:29.593098230 +0000
@@ -36,4 +36,10 @@
 mv -T --backup=numbered C E/ || fail=1
 mv -T --backup=numbered D E/ || fail=1
 
+# Bug#55029
+mkdir F && echo 1 >1 && echo 2 >2 && cp 1 F/X && cp 2 X || framework_failure_
+mv --backup=simple X F/ || fail=1
+compare 1 F/X~ || fail=1
+compare 2 F/X || fail=1
+
 Exit $fail

Reply via email to