* update coreutils to 9.4-2

This commit is contained in:
Alexander Baldeck 2023-10-26 07:09:04 +02:00
parent bee2ccb766
commit 644a1b81b8
6 changed files with 80 additions and 314 deletions

View File

@ -1,92 +0,0 @@
From e8b56ebd536e82b15542a00c888109471936bfda Mon Sep 17 00:00:00 2001
From: =?utf8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Fri, 24 Sep 2021 20:57:41 +0100
Subject: [PATCH] chmod: fix exit status when ignoring symlinks
* src/chmod.c: Reorder enum so CH_NOT_APPLIED
can be treated as a non error.
* tests/chmod/ignore-symlink.sh: A new test.
* tests/local.mk: Reference the new test.
Fixes https://bugs.gnu.org/50784
---
src/chmod.c | 4 ++--
tests/chmod/ignore-symlink.sh | 31 +++++++++++++++++++++++++++++++
tests/local.mk | 1 +
4 files changed, 40 insertions(+), 2 deletions(-)
create mode 100755 tests/chmod/ignore-symlink.sh
diff --git a/src/chmod.c b/src/chmod.c
index 37b04f5..57ac47f 100644
--- a/src/chmod.c
+++ b/src/chmod.c
@@ -44,8 +44,8 @@ struct change_status
enum
{
CH_NO_STAT,
- CH_NOT_APPLIED,
CH_FAILED,
+ CH_NOT_APPLIED,
CH_NO_CHANGE_REQUESTED,
CH_SUCCEEDED
}
@@ -322,7 +322,7 @@ process_file (FTS *fts, FTSENT *ent)
if ( ! recurse)
fts_set (fts, ent, FTS_SKIP);
- return CH_NO_CHANGE_REQUESTED <= ch.status;
+ return CH_NOT_APPLIED <= ch.status;
}
/* Recursively change the modes of the specified FILES (the last entry
diff --git a/tests/chmod/ignore-symlink.sh b/tests/chmod/ignore-symlink.sh
new file mode 100755
index 0000000..5ce3de8
--- /dev/null
+++ b/tests/chmod/ignore-symlink.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Test for proper exit code of chmod on a processed symlink.
+
+# Copyright (C) 2021 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ chmod
+
+mkdir dir || framework_failure_
+touch dir/f || framework_failure_
+ln -s f dir/l || framework_failure_
+
+# This operation ignores symlinks but should succeed.
+chmod u+w -R dir 2> out || fail=1
+
+compare /dev/null out || fail=1
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
index 228d0e3..b5b893f 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -456,6 +456,7 @@ all_tests = \
tests/chmod/c-option.sh \
tests/chmod/equal-x.sh \
tests/chmod/equals.sh \
+ tests/chmod/ignore-symlink.sh \
tests/chmod/inaccessible.sh \
tests/chmod/octal.sh \
tests/chmod/setgid.sh \
--
1.9.1

View File

@ -1,20 +1,21 @@
# POWER Maintainer: Alexander Baldeck <alex.bldck@gmail.com>
# Maintainer: Sébastien "Seblu" Luttringer
# Maintainer: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
# Contributor: Allan McRae <allan@archlinux.org>
# Contributor: judd <jvinet@zeroflux.org>
pkgname=coreutils
pkgver=9.3
pkgrel=1
pkgver=9.4
pkgrel=2
pkgdesc='The basic file, shell and text manipulation utilities of the GNU operating system'
arch=(x86_64 powerpc64le powerpc64 powerpc riscv64)
license=('GPL3')
license=('GPL-3.0-or-later' 'GFDL-1.3-or-later')
url='https://www.gnu.org/software/coreutils/'
depends=('glibc' 'acl' 'attr' 'gmp' 'libcap' 'openssl')
source=("https://ftp.gnu.org/gnu/$pkgname/$pkgname-$pkgver.tar.xz"{,.sig})
validpgpkeys=('6C37DC12121A5006BC1DB804DF6FD971306037D9') # Pádraig Brady
sha256sums=('adbcfcfe899235b71e8768dcf07cd532520b7f54f9a8064843f8d199a904bbaa'
sha256sums=('ea613a4cf44612326e917201bbbcdfbd301de21ffc3b59b6e5c07e040b275e52'
'SKIP')
prepare() {

View File

@ -1,136 +0,0 @@
From 093a8b4bfaba60005f14493ce7ef11ed665a0176 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Thu, 23 Mar 2023 13:19:04 +0000
Subject: copy: fix --reflink=auto to fallback in more cases
On restricted systems like android or some containers,
FICLONE could return EPERM, EACCES, or ENOTTY,
which would have induced the command to fail to copy
rather than falling back to a more standard copy.
* src/copy.c (is_terminal_failure): A new function refactored
from handle_clone_fail().
(is_CLONENOTSUP): Merge in the handling of EACCES, ENOTTY, EPERM
as they also pertain to determination of whether cloning is supported
if we ever use this function in that context.
(handle_clone_fail): Use is_terminal_failure() in all cases,
so that we assume a terminal failure in less errno cases.
* NEWS: Mention the bug fix.
Addresses https://bugs.gnu.org/62404
---
NEWS | 8 ++++++++
src/copy.c | 62 +++++++++++++++++++++++++++++++++++---------------------------
2 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/src/copy.c b/src/copy.c
index 3919787..f8ba058 100644
--- a/src/copy.c
+++ b/src/copy.c
@@ -278,15 +278,27 @@ create_hole (int fd, char const *name, bool punch_holes, off_t size)
}
-/* Whether the errno from FICLONE, or copy_file_range
- indicates operation is not supported for this file or file system. */
+/* Whether the errno indicates the operation is a transient failure.
+ I.e., a failure that would indicate the operation _is_ supported,
+ but has failed in a terminal way. */
+
+static bool
+is_terminal_error (int err)
+{
+ return err == EIO || err == ENOMEM || err == ENOSPC || err == EDQUOT;
+}
+
+
+/* Whether the errno from FICLONE, or copy_file_range indicates
+ the operation is not supported/allowed for this file or process. */
static bool
is_CLONENOTSUP (int err)
{
- return err == ENOSYS || is_ENOTSUP (err)
+ return err == ENOSYS || err == ENOTTY || is_ENOTSUP (err)
|| err == EINVAL || err == EBADF
- || err == EXDEV || err == ETXTBSY;
+ || err == EXDEV || err == ETXTBSY
+ || err == EPERM || err == EACCES;
}
@@ -339,20 +351,18 @@ sparse_copy (int src_fd, int dest_fd, char **abuf, size_t buf_size,
{
copy_debug.offload = COPY_DEBUG_UNSUPPORTED;
- if (is_CLONENOTSUP (errno))
- break;
-
- /* copy_file_range might not be enabled in seccomp filters,
- so retry with a standard copy. EPERM can also occur
- for immutable files, but that would only be in the edge case
- where the file is made immutable after creating/truncating,
+ /* Consider operation unsupported only if no data copied.
+ For example, EPERM could occur if copy_file_range not enabled
+ in seccomp filters, so retry with a standard copy. EPERM can
+ also occur for immutable files, but that would only be in the
+ edge case where the file is made immutable after creating,
in which case the (more accurate) error is still shown. */
- if (errno == EPERM && *total_n_read == 0)
+ if (*total_n_read == 0 && is_CLONENOTSUP (errno))
break;
/* ENOENT was seen sometimes across CIFS shares, resulting in
no data being copied, but subsequent standard copies succeed. */
- if (errno == ENOENT && *total_n_read == 0)
+ if (*total_n_read == 0 && errno == ENOENT)
break;
if (errno == EINTR)
@@ -1172,17 +1182,15 @@ handle_clone_fail (int dst_dirfd, char const* dst_relname,
char const* src_name, char const* dst_name,
int dest_desc, bool new_dst, enum Reflink_type reflink_mode)
{
- /* If the clone operation is creating the destination,
- then don't try and cater for all non transient file system errors,
- and instead only cater for specific transient errors. */
- bool transient_failure;
- if (dest_desc < 0) /* currently for fclonefileat(). */
- transient_failure = errno == EIO || errno == ENOMEM
- || errno == ENOSPC || errno == EDQUOT;
- else /* currently for FICLONE. */
- transient_failure = ! is_CLONENOTSUP (errno);
-
- if (reflink_mode == REFLINK_ALWAYS || transient_failure)
+ /* When the clone operation fails, report failure only with errno values
+ known to mean trouble when the clone is supported and called properly.
+ Do not report failure merely because !is_CLONENOTSUP (errno),
+ as systems may yield oddball errno values here with FICLONE.
+ Also is_CLONENOTSUP() is not appropriate for the range of errnos
+ possible from fclonefileat(), so it's more consistent to avoid. */
+ bool report_failure = is_terminal_error (errno);
+
+ if (reflink_mode == REFLINK_ALWAYS || report_failure)
error (0, errno, _("failed to clone %s from %s"),
quoteaf_n (0, dst_name), quoteaf_n (1, src_name));
@@ -1190,14 +1198,14 @@ handle_clone_fail (int dst_dirfd, char const* dst_relname,
but cloned no data. */
if (new_dst /* currently not for fclonefileat(). */
&& reflink_mode == REFLINK_ALWAYS
- && ((! transient_failure) || lseek (dest_desc, 0, SEEK_END) == 0)
+ && ((! report_failure) || lseek (dest_desc, 0, SEEK_END) == 0)
&& unlinkat (dst_dirfd, dst_relname, 0) != 0 && errno != ENOENT)
error (0, errno, _("cannot remove %s"), quoteaf (dst_name));
- if (! transient_failure)
+ if (! report_failure)
copy_debug.reflink = COPY_DEBUG_UNSUPPORTED;
- if (reflink_mode == REFLINK_ALWAYS || transient_failure)
+ if (reflink_mode == REFLINK_ALWAYS || report_failure)
return false;
return true;
--
cgit v1.1

View File

@ -1,39 +0,0 @@
From 1a80fab339d52db7e284b4f2f41068d5d8dd7e4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Mon, 3 Apr 2023 18:12:33 +0100
Subject: [PATCH] tests: cp: test --backup with subdirectories
* tests/cp/backup-dir.sh: Add a test to ensure
we rename appropriately when backing up through subdirs.
* NEWS: Mention the bug fix.
Addresses https://bugs.gnu.org/62607
---
NEWS | 5 +++++
tests/cp/backup-dir.sh | 8 +++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/tests/cp/backup-dir.sh b/tests/cp/backup-dir.sh
index 6573d58e0..5c17498cf 100755
--- a/tests/cp/backup-dir.sh
+++ b/tests/cp/backup-dir.sh
@@ -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-2023 Free Software Foundation, Inc.
@@ -29,4 +29,10 @@ cp -ab x y || fail=1
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,dst}/foo || framework_failure_
+touch {src,dst}/foo/bar || framework_failure_
+cp --recursive --backup src/* dst || fail=1
+
Exit $fail
--
2.26.2

View File

@ -1,43 +0,0 @@
From 418aa564ebff70c1d118a5d3307a6d0b147ff7a2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
Date: Mon, 3 Apr 2023 18:06:22 +0100
Subject: [PATCH] backupfile: fix bug when renaming from subdirectory
* lib/backupfile.c (backup_internal): Ensure we use the
appropriate offset if operating on a subdirectory,
i.e., on an updated sdir.
Fixes https://bugs.gnu.org/62607
---
ChangeLog | 8 ++++++++
lib/backupfile.c | 7 ++++---
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/lib/backupfile.c b/lib/backupfile.c
index 9cca271343..5bcf924414 100644
--- a/lib/backupfile.c
+++ b/lib/backupfile.c
@@ -331,7 +331,7 @@ backupfile_internal (int dir_fd, char const *file,
return s;
DIR *dirp = NULL;
- int sdir = dir_fd;
+ int sdir = -1;
idx_t base_max = 0;
while (true)
{
@@ -370,9 +370,10 @@ backupfile_internal (int dir_fd, char const *file,
if (! rename)
break;
- idx_t offset = backup_type == simple_backups ? 0 : base_offset;
+ 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 (sdir, 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))
--
2.26.2

View File

@ -0,0 +1,75 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=HaQo
-----END PGP PUBLIC KEY BLOCK-----