From 77891fc0514785a2f80efa4d19618aba0a85b154 Mon Sep 17 00:00:00 2001 From: Kaihao Bai Date: Mon, 5 Dec 2022 15:34:50 +0800 Subject: [PATCH] add some bugfix from upstream Signed-off-by: Kaihao Bai --- 0001-sort-fix-sort-g-infloop-again.patch | 80 +++++++ 0002-cp-fix-cp-rx-mnt.patch | 221 ++++++++++++++++++ ...re-compute-runs-the-file-it-inspects.patch | 98 ++++++++ coreutils.spec | 12 +- 4 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 0001-sort-fix-sort-g-infloop-again.patch create mode 100644 0002-cp-fix-cp-rx-mnt.patch create mode 100644 0003-runcon-ensure-compute-runs-the-file-it-inspects.patch diff --git a/0001-sort-fix-sort-g-infloop-again.patch b/0001-sort-fix-sort-g-infloop-again.patch new file mode 100644 index 0000000..635d64c --- /dev/null +++ b/0001-sort-fix-sort-g-infloop-again.patch @@ -0,0 +1,80 @@ +From 664c19d8dba246edcd30ee5234e77c5174561dc7 Mon Sep 17 00:00:00 2001 +From: Paul Eggert +Date: Sun, 1 May 2022 22:46:21 -0700 +Subject: [PATCH 1/3] sort: fix sort -g infloop again + +Problem reported by Giulio Genovese (Bug#55212). +* src/sort.c (nan_compare): To compare NaNs, simply printf+strcmp. +This avoids the problem of padding bits and unspecified behavior. +Args are now long double instead of char *; caller changed. + +Signed-off-by: Kaihao Bai +--- + NEWS | 10 ++++++++++ + src/sort.c | 21 ++++++--------------- + 2 files changed, 16 insertions(+), 15 deletions(-) + +diff --git a/NEWS b/NEWS +index 69446d431..7f247fffd 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,5 +1,15 @@ + GNU coreutils NEWS -*- outline -*- + ++* Noteworthy changes in release ?.? (????-??-??) [?] ++ ++** Bug fixes ++ ++ 'sort -g' no longer infloops when given multiple NaNs on platforms ++ like x86_64 where 'long double' has padding bits in memory. ++ Although the fix alters sort -g's NaN ordering, that ordering has ++ long been documented to be platform-dependent. ++ [bug introduced 1999-05-02 and only partly fixed in coreutils-8.14] ++ + * Noteworthy changes in release 9.1 (2022-04-15) [stable] + + ** Bug fixes +diff --git a/src/sort.c b/src/sort.c +index 3b775d6bb..b2a465cf5 100644 +--- a/src/sort.c ++++ b/src/sort.c +@@ -2003,22 +2003,13 @@ numcompare (char const *a, char const *b) + return strnumcmp (a, b, decimal_point, thousands_sep); + } + +-/* Work around a problem whereby the long double value returned by glibc's +- strtold ("NaN", ...) contains uninitialized bits: clear all bytes of +- A and B before calling strtold. FIXME: remove this function if +- gnulib guarantees that strtold's result is always well defined. */ + static int +-nan_compare (char const *sa, char const *sb) ++nan_compare (long double a, long double b) + { +- long double a; +- memset (&a, 0, sizeof a); +- a = strtold (sa, NULL); +- +- long double b; +- memset (&b, 0, sizeof b); +- b = strtold (sb, NULL); +- +- return memcmp (&a, &b, sizeof a); ++ char buf[2][sizeof "-nan()" + CHAR_BIT * sizeof a]; ++ snprintf (buf[0], sizeof buf[0], "%Lf", a); ++ snprintf (buf[1], sizeof buf[1], "%Lf", b); ++ return strcmp (buf[0], buf[1]); + } + + static int +@@ -2046,7 +2037,7 @@ general_numcompare (char const *sa, char const *sb) + : a == b ? 0 + : b == b ? -1 + : a == a ? 1 +- : nan_compare (sa, sb)); ++ : nan_compare (a, b)); + } + + /* Return an integer in 1..12 of the month name MONTH. +-- +2.27.0 + diff --git a/0002-cp-fix-cp-rx-mnt.patch b/0002-cp-fix-cp-rx-mnt.patch new file mode 100644 index 0000000..cdb61f3 --- /dev/null +++ b/0002-cp-fix-cp-rx-mnt.patch @@ -0,0 +1,221 @@ +From be45c89408479f3f3ce2b82d5090b71427f969af Mon Sep 17 00:00:00 2001 +From: Paul Eggert +Date: Sat, 11 Jun 2022 10:49:18 -0700 +Subject: [PATCH 2/3] =?UTF-8?q?cp:=20fix=20=E2=80=98cp=20-rx=20/=20/mnt?= + =?UTF-8?q?=E2=80=99?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Problem reported by pkoraou@gmail.com (Bug#55910). +* src/copy.c (copy_internal): Treat a relative destination name "" +as if it were "." for the purpose of directory-relative syscalls +like fstatat that might might refer to the destination directory. + +Signed-off-by: Kaihao Bai +--- + NEWS | 6 ++++++ + src/copy.c | 50 +++++++++++++++++++++++--------------------------- + 2 files changed, 29 insertions(+), 27 deletions(-) + +diff --git a/NEWS b/NEWS +index 7f247fffd..9657f5f67 100644 +--- a/NEWS ++++ b/NEWS +@@ -4,6 +4,12 @@ GNU coreutils NEWS -*- outline -*- + + ** Bug fixes + ++ 'cp -rx / /mnt' no longer complains "cannot create directory /mnt/". ++ [bug introduced in coreutils-9.1] ++ ++ 'mv --backup=simple f d/' no longer mistakenly backs up d/f to f~. ++ [bug introduced in coreutils-9.1] ++ + 'sort -g' no longer infloops when given multiple NaNs on platforms + like x86_64 where 'long double' has padding bits in memory. + Although the fix alters sort -g's NaN ordering, that ordering has +diff --git a/src/copy.c b/src/copy.c +index b15d91990..edc822134 100644 +--- a/src/copy.c ++++ b/src/copy.c +@@ -1954,6 +1954,7 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + { + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + /* 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + 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 @@ copy_internal (char const *src_name, char const *dst_name, + + 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 @@ un_backup: + 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 + { +-- +2.27.0 + diff --git a/0003-runcon-ensure-compute-runs-the-file-it-inspects.patch b/0003-runcon-ensure-compute-runs-the-file-it-inspects.patch new file mode 100644 index 0000000..2abb845 --- /dev/null +++ b/0003-runcon-ensure-compute-runs-the-file-it-inspects.patch @@ -0,0 +1,98 @@ +From eca6dd1f1822660e6521c5bc189aef2f4f805a9a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?P=C3=A1draig=20Brady?= +Date: Sun, 24 Jul 2022 18:46:10 +0100 +Subject: [PATCH 3/3] runcon: ensure --compute runs the file it inspects + +* src/runcon.c (main): With -c avoid searching the path +to ensure the file specified to --compute is executed. +* tests/misc/runcon-compute.sh: Add a new test. +* tests/local.mk: Reference the new test. +* NEWS: Mention the bug fix. +Reported in https://bugs.debian.org/1013924 + +Signed-off-by: Kaihao Bai +--- + NEWS | 4 ++++ + src/runcon.c | 2 +- + tests/local.mk | 1 + + tests/misc/runcon-compute.sh | 28 ++++++++++++++++++++++++++++ + 4 files changed, 34 insertions(+), 1 deletion(-) + create mode 100755 tests/misc/runcon-compute.sh + +diff --git a/NEWS b/NEWS +index 9657f5f67..86f04aa7f 100644 +--- a/NEWS ++++ b/NEWS +@@ -10,6 +10,10 @@ GNU coreutils NEWS -*- outline -*- + 'mv --backup=simple f d/' no longer mistakenly backs up d/f to f~. + [bug introduced in coreutils-9.1] + ++ runcon --compute no longer looks up the specified command in the $PATH ++ so that there is no mismatch between the inspected and executed file. ++ [bug introduced when runcon was introduced in coreutils-6.9.90] ++ + 'sort -g' no longer infloops when given multiple NaNs on platforms + like x86_64 where 'long double' has padding bits in memory. + Although the fix alters sort -g's NaN ordering, that ordering has +diff --git a/src/runcon.c b/src/runcon.c +index c4227c784..d85411c79 100644 +--- a/src/runcon.c ++++ b/src/runcon.c +@@ -255,7 +255,7 @@ main (int argc, char **argv) + if (cur_context != NULL) + freecon (cur_context); + +- execvp (argv[optind], argv + optind); ++ (compute_trans ? execv : execvp) (argv[optind], argv + optind); + + int exit_status = errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE; + error (0, errno, "%s", quote (argv[optind])); +diff --git a/tests/local.mk b/tests/local.mk +index 0f7778619..0496c2873 100644 +--- a/tests/local.mk ++++ b/tests/local.mk +@@ -351,6 +351,7 @@ all_tests = \ + tests/misc/readlink-fp-loop.sh \ + tests/misc/readlink-root.sh \ + tests/misc/realpath.sh \ ++ tests/misc/runcon-compute.sh \ + tests/misc/runcon-no-reorder.sh \ + tests/misc/sha1sum.pl \ + tests/misc/sha1sum-vec.pl \ +diff --git a/tests/misc/runcon-compute.sh b/tests/misc/runcon-compute.sh +new file mode 100755 +index 000000000..1c4e0c060 +--- /dev/null ++++ b/tests/misc/runcon-compute.sh +@@ -0,0 +1,28 @@ ++#!/bin/sh ++# Ensure that runcon -c uses absolute file names ++ ++# Copyright (C) 2022 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 . ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ runcon ++ ++# Create an executable that's sure to fail ++printf '%s\n' '#!/bin/sh' 'exit 1' >> 'true' || framework_failure_ ++chmod a+x 'true' || framework_failure_ ++ ++returns_ 1 runcon -c true || fail=1 ++ ++Exit $fail +-- +2.27.0 + diff --git a/coreutils.spec b/coreutils.spec index 1faf830..9dd872b 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -1,4 +1,4 @@ -%define anolis_release 2 +%define anolis_release 3 Summary: A set of basic GNU tools commonly used in shell scripts Name: coreutils Version: 9.1 @@ -50,6 +50,11 @@ Provides: coreutils-full = %{version}-%{release} %include %{SOURCE51} Obsoletes: %{name} < 8.24 +# backport patch from upstream +Patch0001: 0001-sort-fix-sort-g-infloop-again.patch +Patch0002: 0002-cp-fix-cp-rx-mnt.patch +Patch0003: 0003-runcon-ensure-compute-runs-the-file-it-inspects.patch + %description These are the GNU core utilities. This package is the combination of the old GNU fileutils, sh-utils, and textutils packages. @@ -86,7 +91,7 @@ The %{name}-doc package contains documentation files for %{name}. %prep %{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' -%autosetup -p1 +%autosetup -n %{name}-%{version} -p1 # will be regenerated in the build directories rm -f src/fs.h @@ -221,6 +226,9 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir %doc NEWS README THANKS TODO %changelog +* Mon Dec 05 2022 Kaihao Bai - 9.1-3 +- add upstream bugfix + * Tue Nov 01 2022 mgb01105731 -9.1-2 - optimise spec file -- Gitee