public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/coreutils] rawhide: rebase to the latest upstream release
@ 2026-09-21 9:28
0 siblings, 0 replies; only message in thread
From: @ 2026-09-21 9:28 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/coreutils
Branch : rawhide
Commit : 072fa66649a42f9da3181d031188c78890b330c1
Author : Lukáš Zaoral <lzaoral@redhat.com>
Date : 2026-09-21T09:13:42+02:00
Stats : +370/-564 in 11 file(s)
URL : https://src.fedoraproject.org/rpms/coreutils/c/072fa66649a42f9da3181d031188c78890b330c1?branch=rawhide
Log:
rebase to the latest upstream release
Resolves: rhbz#2533195
---
diff --git a/coreutils-8.26-test-lock.patch b/coreutils-8.26-test-lock.patch
deleted file mode 100644
index d66928c..0000000
--- a/coreutils-8.26-test-lock.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0d04ee8ddedb2bf33d64f148f246a3b7ec4fef21 Mon Sep 17 00:00:00 2001
-From: Kamil Dudka <kdudka@redhat.com>
-Date: Mon, 23 Jan 2017 12:35:41 +0100
-Subject: [PATCH] test-lock: disable the rwlock test
-
-It hangs indefinitely if the system rwlock implementation does not
-prevent writer starvation (and glibc does not implement it).
-
-Bug: http://www.mail-archive.com/bug-gnulib@gnu.org/msg33017.html
----
- gnulib-tests/test-lock.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/gnulib-tests/test-lock.c b/gnulib-tests/test-lock.c
-index aa6de27..5af0a6c 100644
---- a/gnulib-tests/test-lock.c
-+++ b/gnulib-tests/test-lock.c
-@@ -42,7 +42,7 @@
- Uncomment some of these, to verify that all tests crash if no locking
- is enabled. */
- #define DO_TEST_LOCK 1
--#define DO_TEST_RWLOCK 1
-+#define DO_TEST_RWLOCK 0
- #define DO_TEST_RECURSIVE_LOCK 1
- #define DO_TEST_ONCE 1
-
---
-2.7.4
-
diff --git a/coreutils-9.11-CVE-2026-56391.patch b/coreutils-9.11-CVE-2026-56391.patch
deleted file mode 100644
index 7c4b862..0000000
--- a/coreutils-9.11-CVE-2026-56391.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 3953e3d60edb0f23bdf367a3ccbc2282b9e00d1b Mon Sep 17 00:00:00 2001
-From: Paul Eggert <eggert@cs.ucla.edu>
-Date: Tue, 28 Apr 2026 11:25:00 -0700
-Subject: [PATCH] uniq: fix read overrun with -w
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Problem reported by Michał Majchrowicz.
-* src/uniq.c (find_field): Fix typo.
-* tests/uniq/uniq.pl (add_z_variants): Test for the bug.
-
-(cherry picked from commit d64e35a8a4c0e4608321433e0d84d917e4e36371)
----
- THANKS.in | 1 +
- src/uniq.c | 4 ++--
- tests/uniq/uniq.pl | 3 +++
- 3 files changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/THANKS.in b/THANKS.in
-index 35fee75..5a2fd35 100644
---- a/THANKS.in
-+++ b/THANKS.in
-@@ -459,6 +459,7 @@ Michail Litvak mci@owl.openwall.com
- Michal Politowski mpol@charybda.icm.edu.pl
- Michal Svec msvec@suse.cz
- Michal Trunecka mtruneck@redhat.com
-+Michał Majchrowicz mmajchrowicz@afine.com
- Michel Robitaille robitail@IRO.UMontreal.CA
- Michiel Bacchiani bacchian@raven.bu.edu
- Mike Castle dalgoda@ix.netcom.com
-diff --git a/src/uniq.c b/src/uniq.c
-index 3046359..5834596 100644
---- a/src/uniq.c
-+++ b/src/uniq.c
-@@ -285,8 +285,8 @@ find_field (struct linebuffer const *line, idx_t *plen)
- else
- {
- char *ep = lp;
-- for (idx_t i = check_chars; 0 < i && lp < lim; i--)
-- ep += mcel_scan (lp, lim).len;
-+ for (idx_t i = check_chars; 0 < i && ep < lim; i--)
-+ ep += mcel_scan (ep, lim).len;
- len = ep - lp;
- }
-
-diff --git a/tests/uniq/uniq.pl b/tests/uniq/uniq.pl
-index b558fb3..0df7ec6 100755
---- a/tests/uniq/uniq.pl
-+++ b/tests/uniq/uniq.pl
-@@ -234,6 +234,9 @@ my @Tests =
- " - 'separate'\n" .
- " - 'both'\n" .
- "Try '$prog --help' for more information.\n"}],
-+ # Test for read buffer overrun.
-+ do { my $longline = "\360\237\230\200" . "A" x 255 . "\n";
-+ ['146', '-w256', {IN => $longline x 2}, {OUT => $longline}] },
- );
-
- # Locale related tests
---
-2.55.0
-
diff --git a/coreutils-9.11-tee-infinite-loop.patch b/coreutils-9.11-tee-infinite-loop.patch
deleted file mode 100644
index 2a2d5ba..0000000
--- a/coreutils-9.11-tee-infinite-loop.patch
+++ /dev/null
@@ -1,236 +0,0 @@
-From c6b1d7c08d802accd0075c3dc29ba46d42fca8d7 Mon Sep 17 00:00:00 2001
-From: Collin Funk <collin.funk1@gmail.com>
-Date: Mon, 18 May 2026 20:40:28 -0700
-Subject: [PATCH] tee: fix infinite loop when write returns EAGAIN and short
- write errors
-
-* THANKS.in: Add Bernhard M. Wiedemann for reporting the bugs.
-* src/iopoll.c (close_wait): Remove function.
-(write_wait): Don't call wait_for_nonblocking_write if write is
-successful. Handle errors more robustly.
-* src/iopoll.h (close_wait): Remove declaration.
-* src/tee.c (tee_files): Use close instead of close_wait.
-* tests/tee/short-write.sh: New test for the bug.
-* tests/tee/write-eagain.sh: Likewise.
-* tests/local.mk (all_tests): Add the new tests.
-Fixes https://bugs.gnu.org/81060
-
-(cherry picked from commit 0d6fcb99d691d920961938e61c43478566ef626e)
----
- THANKS.in | 1 +
- src/iopoll.c | 59 ++++++++++++++++++++++++---------------
- src/iopoll.h | 1 -
- src/tee.c | 2 +-
- tests/local.mk | 2 ++
- tests/tee/short-write.sh | 33 ++++++++++++++++++++++
- tests/tee/write-eagain.sh | 31 ++++++++++++++++++++
- 7 files changed, 104 insertions(+), 25 deletions(-)
- create mode 100755 tests/tee/short-write.sh
- create mode 100755 tests/tee/write-eagain.sh
-
-diff --git a/THANKS.in b/THANKS.in
-index 5a2fd35..b1453be 100644
---- a/THANKS.in
-+++ b/THANKS.in
-@@ -86,6 +86,7 @@ Bernd Leibing bernd.leibing@rz.uni-ulm.de
- Bernd Melchers melchers@cis.fu-berlin.de
- Bernhard Baehr bernhard.baehr@gmx.de
- Bernhard Gabler bernhard@uni-koblenz.de
-+Bernhard M. Wiedemann bwiedemann@suse.de
- Bernhard Rosenkraenzer bero@redhat.de
- Bert Deknuydt Bert.Deknuydt@esat.kuleuven.ac.be
- Bert Wesarg bert.wesarg@googlemail.com
-diff --git a/src/iopoll.c b/src/iopoll.c
-index de20bc8..0bd2d6b 100644
---- a/src/iopoll.c
-+++ b/src/iopoll.c
-@@ -194,17 +194,6 @@ wait_for_nonblocking_write (int fd)
- return true;
- }
-
--/* wrapper for close() that also waits for FD if non blocking. */
--
--extern bool
--close_wait (int fd)
--{
-- while (wait_for_nonblocking_write (fd))
-- ;
-- return close (fd) == 0;
--}
--
--
- /* wrapper for write() that also waits for FD if non blocking. */
-
- extern bool
-@@ -212,19 +201,43 @@ write_wait (int fd, void const *buffer, size_t size)
- {
- unsigned char const *buf = buffer;
-
-- while (true)
-+ do
- {
-- ssize_t written = write (fd, buf, size);
-- if (written < 0)
-- written = 0;
--
-- size -= written;
-- if (size <= 0) /* everything written */
-- return true;
--
-- if (! wait_for_nonblocking_write (fd))
-- return false;
-+ const ssize_t written = write (fd, buf, size);
-+ /* POSIX says that calling write with SIZE of zero may detect and
-+ return errors. If no error occurs, or write makes no attempt
-+ to detect errors, then write returns zero with no other
-+ results. write_fail will return successfully in this case. */
-+ if (written == 0)
-+ {
-+ if (size == 0)
-+ return true;
-+ else
-+ {
-+ /* If SIZE is greater than zero and write returns zero,
-+ treat it as an error. Some buggy drivers behave this
-+ way. See src/dd.c and Gnulib's lib/full-write.c for
-+ more details. */
-+ errno = ENOSPC;
-+ return false;
-+ }
-+ }
-
-- buf += written;
-+ if (written < 0)
-+ {
-+ /* Return an error if write detected one with a SIZE of zero.
-+ Otherwise, if SIZE is greater than zero, fail if it does
-+ not become writable. */
-+ if (size == 0 || ! wait_for_nonblocking_write (fd))
-+ return false;
-+ }
-+ else
-+ {
-+ buf += written;
-+ size -= written;
-+ }
- }
-+ while (0 < size);
-+
-+ return true;
- }
-diff --git a/src/iopoll.h b/src/iopoll.h
-index 1711fda..a1561b9 100644
---- a/src/iopoll.h
-+++ b/src/iopoll.h
-@@ -5,5 +5,4 @@ int iopoll (int fdin, int fdout, bool block);
- bool iopoll_input_ok (int fdin);
- bool iopoll_output_ok (int fdout);
-
--bool close_wait (int fd);
- bool write_wait (int fd, void const *buffer, size_t size);
-diff --git a/src/tee.c b/src/tee.c
-index 32a18e3..fba6ae0 100644
---- a/src/tee.c
-+++ b/src/tee.c
-@@ -329,7 +329,7 @@ tee_files (int nfiles, char **files, bool pipe_check)
-
- /* Close the files, but not standard output. */
- for (int i = 1; i <= nfiles; i++)
-- if (0 <= descriptors[i] && ! close_wait (descriptors[i]))
-+ if (0 <= descriptors[i] && close (descriptors[i]) < 0)
- {
- error (0, errno, "%s", quotef (files[i]));
- ok = false;
-diff --git a/tests/local.mk b/tests/local.mk
-index e2c07a8..ea5ef7c 100644
---- a/tests/local.mk
-+++ b/tests/local.mk
-@@ -485,7 +485,9 @@ all_tests = \
- tests/tac/tac-2-nonseekable.sh \
- tests/tail/tail.pl \
- tests/tee/append.sh \
-+ tests/tee/short-write.sh \
- tests/tee/tee.sh \
-+ tests/tee/write-eagain.sh \
- tests/test/test-N.sh \
- tests/test/test-diag.pl \
- tests/test/test-file.sh \
-diff --git a/tests/tee/short-write.sh b/tests/tee/short-write.sh
-new file mode 100755
-index 0000000..4270926
---- /dev/null
-+++ b/tests/tee/short-write.sh
-@@ -0,0 +1,33 @@
-+#!/bin/sh
-+# Test 'tee' when a write is short.
-+
-+# Copyright (C) 2026 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_ tee
-+require_strace_ write
-+
-+printf 'abcdef' >file1-exp || framework_failure_
-+printf 'f' >out-exp || framework_failure_
-+
-+# In coreutils-9.11, a short write would be treated as an error.
-+strace -qqq -o /dev/null --trace-fds=1 -e trace=write \
-+ -e inject=write:retval=1:when=1..5 tee file1 >out 2>err <file1-exp || fail=1
-+compare file1-exp file1 || fail=1
-+compare out-exp out || fail=1
-+compare /dev/null err || fail=1
-+
-+Exit $fail
-diff --git a/tests/tee/write-eagain.sh b/tests/tee/write-eagain.sh
-new file mode 100755
-index 0000000..f434ee6
---- /dev/null
-+++ b/tests/tee/write-eagain.sh
-@@ -0,0 +1,31 @@
-+#!/bin/sh
-+# Test 'tee' when a write fails with errno set to EAGAIN.
-+
-+# Copyright (C) 2026 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_ tee
-+require_strace_ write
-+
-+# In coreutils-9.11 the following test would infinite loop.
-+echo a >exp || framework_failure_
-+timeout 10 strace -qqq -o /dev/null -e trace-fds=3 \
-+ -e inject=write:error=EAGAIN:when=1 tee file1 <exp >out 2>err || fail=1
-+compare exp file1 || fail=1
-+compare exp out || fail=1
-+compare /dev/null err || fail=1
-+
-+Exit $fail
---
-2.55.0
-
diff --git a/coreutils-9.11-unexpand-heap-overflows.patch b/coreutils-9.11-unexpand-heap-overflows.patch
deleted file mode 100644
index 3bab532..0000000
--- a/coreutils-9.11-unexpand-heap-overflows.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-From f7d5b763f691b36603cdd2ac1fc79a6a731bddbf Mon Sep 17 00:00:00 2001
-From: Pádraig Brady <P@draigBrady.com>
-Date: Tue, 28 Apr 2026 20:33:10 +0100
-Subject: [PATCH] unexpand: fix heap overflow
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-* src/unexpand.c (unexpand): Use xinmalloc() to gracefully
-handle overflow. Also use the runtime locale specific MB_CUR_MAX
-rather than the worst case MB_LEN_MAX.
-* tests/unexpand/mb.sh: Add a test case that fails in a default
-glibc build with either MB_CUR_MAX or MB_LEN_MAX.
-Reported by Michał Majchrowicz.
-
-(cherry picked from commit b60a159fdc5bfcf9988d3a4cb6f53abe8ad5d35d)
----
- src/unexpand.c | 2 +-
- tests/unexpand/mb.sh | 8 ++++++++
- 2 files changed, 9 insertions(+), 1 deletion(-)
-
-diff --git a/src/unexpand.c b/src/unexpand.c
-index 4fbf9d3..761c8ea 100644
---- a/src/unexpand.c
-+++ b/src/unexpand.c
-@@ -131,7 +131,7 @@ unexpand (void)
- /* The worst case is a non-blank character, then one blank, then a
- tab stop, then MAX_COLUMN_WIDTH - 1 blanks, then a non-blank; so
- allocate MAX_COLUMN_WIDTH bytes to store the blanks. */
-- pending_blank = ximalloc (max_column_width * sizeof (char) * MB_LEN_MAX);
-+ pending_blank = xinmalloc (max_column_width, MB_CUR_MAX);
-
- while (true)
- {
-diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh
-index 76a2679..076a1c1 100755
---- a/tests/unexpand/mb.sh
-+++ b/tests/unexpand/mb.sh
-@@ -17,6 +17,7 @@
-
- . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
- print_ver_ unexpand printf
-+getlimits_
-
- test "$LOCALE_FR_UTF8" != none || skip_ "French UTF-8 locale not available"
- export LC_ALL="$LOCALE_FR_UTF8"
-@@ -161,4 +162,11 @@ EOF
- unexpand -a ./in ./in > out || fail=1
- compare exp out > /dev/null 2>&1 || fail=1
-
-+# Ensure overflow is handed gracefully
-+# coreutils v9.11 induced a buffer overflow with mb_mul=4 (or 16).
-+for mb_mul in 4 6; do
-+ printf ' \n' | unexpand -t $(expr $SIZE_MAX / $mb_mul + 1) 2>err; ret=$?
-+ test "$ret" = 1 || test "$ret" = 0 || { cat err; fail=1; }
-+done
-+
- Exit $fail
---
-2.54.0
-
-From 528c740817d2235dd37269292c5e3167935d2761 Mon Sep 17 00:00:00 2001
-From: aizu-m <aizumusheer2@gmail.com>
-Date: Tue, 9 Jun 2026 12:37:06 +0530
-Subject: [PATCH] unexpand: fix heap overflow when a wide blank overshoots a
- tab stop
-
-* src/unexpand.c (unexpand): Check if the column is greater or equal to
-the next_tab_column.
-* tests/unexpand/mb.sh: Add a test case.
-https://github.com/coreutils/coreutils/pull/285
-Copyright-paperwork-exempt: Yes
-
-(cherry picked from commit 4ade9cf77f6c7b39e3fdc5ce97a778f8e294694c)
----
- src/unexpand.c | 2 +-
- tests/unexpand/mb.sh | 9 +++++++++
- 2 files changed, 10 insertions(+), 1 deletion(-)
-
-diff --git a/src/unexpand.c b/src/unexpand.c
-index 761c8ea..3bde985 100644
---- a/src/unexpand.c
-+++ b/src/unexpand.c
-@@ -201,7 +201,7 @@ unexpand (void)
- {
- column += c32width (g.ch);
-
-- if (! (prev_blank && column == next_tab_column))
-+ if (! (prev_blank && column >= next_tab_column))
- {
- /* It is not yet known whether the pending blanks
- will be replaced by tabs. */
-diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh
-index 076a1c1..84ba035 100755
---- a/tests/unexpand/mb.sh
-+++ b/tests/unexpand/mb.sh
-@@ -169,4 +169,13 @@ for mb_mul in 4 6; do
- test "$ret" = 1 || test "$ret" = 0 || { cat err; fail=1; }
- done
-
-+# A blank whose display width exceeds the tab distance must not overrun
-+# the pending-blank buffer. With -t1 every column is a tab stop, so a
-+# width-2 ideographic space steps over the stop without landing on it;
-+# the run of blanks then grew pending_blank without bound.
-+ideo_space=$(env printf '\u3000')
-+{ yes "$ideo_space" | head -n 40000 | tr -d '\n'; echo; } |
-+ unexpand -t1 >out 2>err; ret=$?
-+test "$ret" = 0 || { cat err; fail=1; }
-+
- Exit $fail
---
-2.54.0
-
diff --git a/coreutils-9.12-env-quote-fix.patch b/coreutils-9.12-env-quote-fix.patch
new file mode 100644
index 0000000..9cc21de
--- /dev/null
+++ b/coreutils-9.12-env-quote-fix.patch
@@ -0,0 +1,211 @@
+From 5cc25e5e5cca81091bf765094985aafa791da3d7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
+Date: Tue, 15 Sep 2026 20:26:28 +0100
+Subject: [PATCH] env,printenv: only quote when outputting to terminals
+
+To support albeit non-robust but existing use cases like:
+
+ env | grep SPARK_JAVA_OPT_ | sort -t_ -k4 -n |
+ sed 's/[^=]*=\(.*\)/\1/g' > java_opts.txt
+ readarray -t SPARK_EXECUTOR_JAVA_OPTS < java_opts.txt
+ ...
+ CMD=("${JAVA_HOME}/bin/java" "${SPARK_EXECUTOR_JAVA_OPTS[@]}" ...)
+
+* src/env.c (main): Restrict quoting to terminals.
+* src/printenv.c (main): Likewise.
+* tests/env/env.sh: Adjust accordingly.
+* tests/misc/printenv.sh: Likewise.
+* doc/coreutils.texi: Likewise.
+
+Link: https://github.com/coreutils/coreutils/issues/355
+
+(cherry picked from commit 782a1e5bc2090212273bb731dceee2cc2a071e54)
+---
+ doc/coreutils.texi | 16 ++++++----------
+ src/env.c | 2 +-
+ src/printenv.c | 2 +-
+ tests/env/env.sh | 31 +++++++------------------------
+ tests/misc/printenv.sh | 40 ++++------------------------------------
+ 5 files changed, 19 insertions(+), 72 deletions(-)
+
+diff --git a/doc/coreutils.texi b/doc/coreutils.texi
+index 1bd6976..9cafb62 100644
+--- a/doc/coreutils.texi
++++ b/doc/coreutils.texi
+@@ -15525,13 +15525,9 @@ The program accepts the following option. Also see @ref{Common options}.
+
+ @end table
+
+-If no @var{variable}s are specified, @command{printenv} quotes
++If standard output is a terminal @command{printenv} quotes
+ environment variables and their values using the @samp{shell-escape}
+-style. If @var{variable}s are specified, @command{printenv} only quotes
+-their values using the @samp{shell-escape} style if standard output is a
+-terminal.
+-
+-The environment variable @env{QUOTING_STYLE}
++style by default. The environment variable @env{QUOTING_STYLE}
+ specifies the quoting style. Valid quoting styles are:
+ @quotingStyles
+
+@@ -17503,10 +17499,10 @@ If no command name is specified following the environment
+ specifications, the resulting environment is printed. This is like
+ specifying the @command{printenv} program.
+
+-The printed environment variables and their values are quoted using the
+-@samp{shell-escape} style. The environment variable
+-@env{QUOTING_STYLE} specifies the quoting style. Valid quoting styles
+-are:
++If standard output is a terminal, the printed environment variables
++and their values are quoted using the @samp{shell-escape} style by default.
++The environment variable @env{QUOTING_STYLE} specifies the quoting style.
++Valid quoting styles are:
+ @quotingStyles
+
+ For some examples, suppose the environment passed to @command{env}
+diff --git a/src/env.c b/src/env.c
+index e646cba..8fff89e 100644
+--- a/src/env.c
++++ b/src/env.c
+@@ -1113,7 +1113,7 @@ main (int argc, char **argv)
+
+ /* Get the value from QUOTING_STYLE before unsetting environment
+ variables. */
+- if (!opt_nul_terminate_output)
++ if (!opt_nul_terminate_output && isatty (STDOUT_FILENO))
+ {
+ int qs = getenv_quoting_style ();
+ if (qs < 0)
+diff --git a/src/printenv.c b/src/printenv.c
+index dba87f3..00ca29f 100644
+--- a/src/printenv.c
++++ b/src/printenv.c
+@@ -113,7 +113,7 @@ main (int argc, char **argv)
+ bool quote_output = false;
+ idx_t const n_args = argc - optind;
+
+- if (!opt_nul_terminate_output && (n_args <= 0 || isatty (STDOUT_FILENO)))
++ if (!opt_nul_terminate_output && isatty (STDOUT_FILENO))
+ {
+ int qs = getenv_quoting_style ();
+ if (qs < 0)
+diff --git a/tests/env/env.sh b/tests/env/env.sh
+index be822e3..8853e01 100755
+--- a/tests/env/env.sh
++++ b/tests/env/env.sh
+@@ -91,18 +91,14 @@ EOF
+ compare exp out || fail=1
+
+ # env shouldn't care what encoding name or value is
+-cat <<\EOF >exp || framework_failure_
+-NON_UTF8_TEST=''$'\240'
+-EOF
++printf 'NON_UTF8_TEST=\240\n' > exp || framework_failure_
+ env $(printf 'NON_UTF8_TEST=\240') env > all || fail=1
+ grep '^NON_UTF8_TEST' all | LC_ALL=C sort > out || framework_failure_
+ compare exp out || fail=1
+
+-cat <<\EOF >exp || framework_failure_
+-'NON_UTF8_TEST'$'\240'=1
+-EOF
++printf 'NON_UTF8_TEST\240=1\n' > exp || framework_failure_
+ env $(printf 'NON_UTF8_TEST\240=1') env > all || fail=1
+-grep "^'NON_UTF8_TEST" all | LC_ALL=C sort > out || framework_failure_
++grep "^NON_UTF8_TEST" all | LC_ALL=C sort > out || framework_failure_
+ compare exp out || fail=1
+
+ # PATH modifications affect exec.
+@@ -193,29 +189,16 @@ EOF
+ compare err_exp err || fail=1
+ done
+
+-# QUOTING_STYLE affects redirected output.
+-cat <<\EOF >exp-noargs-literal || framework_failure_
+-a b=c d
+-EOF
+-cat <<\EOF >exp-noargs-shell || framework_failure_
+-'a b'='c d'
+-EOF
+-tr "'" '"' <exp-noargs-shell >exp-noargs-c || framework_failure_
+-for qs in literal shell c; do
++# QUOTING_STYLE does not affect redirected output.
++printf '%s\n' 'a b=c d' > exp || framework_failure_
++for qs in literal shell-always invalid; do
+ env -i PATH="$PATH" QUOTING_STYLE=$qs 'a b'='c d' \
+ env >out-t 2>err || fail=1
+ grep -vE '^["'"'"']?'\
+ '(__CF_USER_TEXT_ENCODING|QUOTING_STYLE|(LD_ORIGIN_)?PATH)["'"'"']?=' \
+ out-t >out || framework_failure_
+- compare exp-noargs-$qs out || fail=1
++ compare exp out || fail=1
+ compare /dev/null err || fail=1
+ done
+
+-# Check the behavior with an invalid value for QUOTING_STYLE.
+-printf 'env: ignoring invalid value of environment variable %s\n' \
+- "QUOTING_STYLE: 'invalid'" >exp || framework_failure_
+-env QUOTING_STYLE=invalid env >out 2>err || fail=1
+-grep '^QUOTING_STYLE=invalid$' out || fail=1
+-compare exp err || fail=1
+-
+ Exit $fail
+diff --git a/tests/misc/printenv.sh b/tests/misc/printenv.sh
+index b8c3696..33ad6cc 100755
+--- a/tests/misc/printenv.sh
++++ b/tests/misc/printenv.sh
+@@ -80,48 +80,16 @@ compare exp out || fail=1
+ returns_ 1 env a=b=c printenv a=b > out || fail=1
+ compare /dev/null out || fail=1
+
+-# QUOTING_STYLE affects redirected output.
+-cat <<\EOF >exp-noargs-literal || framework_failure_
+-a b=c d
+-EOF
+-cat <<\EOF >exp-arg-literal || framework_failure_
+-c d
+-EOF
+-cat <<\EOF >exp-args-literal || framework_failure_
+-c d
+-c d
+-EOF
+-cat <<\EOF >exp-noargs-shell || framework_failure_
+-'a b'='c d'
+-EOF
+-cp exp-arg-literal exp-arg-shell &&
+-cp exp-args-literal exp-args-shell || framework_failure_
+-for t in noargs arg args; do
+- tr "'" '"' <exp-$t-shell >exp-$t-c || framework_failure_
+-done
+-for qs in literal shell c; do
++# QUOTING_STYLE does not affect redirected output.
++printf '%s\n' 'a b=c d' > exp || framework_failure_
++for qs in literal shell-always invalid; do
+ env -i PATH="$PATH" QUOTING_STYLE=$qs 'a b'='c d' \
+ printenv >out-t 2>err || fail=1
+ grep -vE '^["'"'"']?'\
+ '(__CF_USER_TEXT_ENCODING|QUOTING_STYLE|(LD_ORIGIN_)?PATH)["'"'"']?=' \
+ out-t >out || framework_failure_
+- compare exp-noargs-$qs out || fail=1
+- compare /dev/null err || fail=1
+- env -i PATH="$PATH" QUOTING_STYLE=$qs 'a b'='c d' \
+- printenv 'a b' >out 2>err || fail=1
+- compare exp-arg-$qs out || fail=1
+- compare /dev/null err || fail=1
+- env -i PATH="$PATH" QUOTING_STYLE=$qs 'a b'='c d' \
+- printenv 'a b' 'a b' >out 2>err || fail=1
+- compare exp-args-$qs out || fail=1
++ compare exp out || fail=1
+ compare /dev/null err || fail=1
+ done
+
+-# Check the behavior with an invalid value for QUOTING_STYLE.
+-printf 'printenv: ignoring invalid value of environment variable %s\n' \
+- "QUOTING_STYLE: 'invalid'" >exp || framework_failure_
+-env QUOTING_STYLE=invalid printenv >out 2>err || fail=1
+-grep '^QUOTING_STYLE=invalid$' out || fail=1
+-compare exp err || fail=1
+-
+ Exit $fail
+--
+2.55.0
+
diff --git a/coreutils-9.12-gnulib-regex-greek.patch b/coreutils-9.12-gnulib-regex-greek.patch
new file mode 100644
index 0000000..10edd81
--- /dev/null
+++ b/coreutils-9.12-gnulib-regex-greek.patch
@@ -0,0 +1,76 @@
+From 2630086e1c850aae9c2cfa441c25f376bee0e75c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
+Date: Sat, 19 Sep 2026 12:45:14 +0100
+Subject: [PATCH] regex: check for glibc greek locale bug 20381
+
+test-regex-el fails on glibc-2.44.9000-2.fc46.x86_64
+due to regex not being replaced there.
+gnulib was patched to fix the bug in commit 0eb6867f9c.
+
+* m4/regex.m4 (gl_REGEX): Check for
+<https://sourceware.org/bugzilla/show_bug.cgi?id=20381>
+
+(cherry picked from commit acc1d91810195f62ce32c22d271fed3da74794bf)
+---
+ m4/regex.m4 | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+diff --git a/m4/regex.m4 b/m4/regex.m4
+index 4a7257d..58559d9 100644
+--- a/m4/regex.m4
++++ b/m4/regex.m4
+@@ -36,6 +36,7 @@ AC_DEFUN([gl_REGEX],
+ [AC_LANG_PROGRAM(
+ [[#include <regex.h>
+
++ #include <ctype.h>
+ #include <locale.h>
+ #include <limits.h>
+ #include <string.h>
+@@ -351,6 +352,43 @@ AC_DEFUN([gl_REGEX],
+ }
+ }
+
++ /* Test for glibc bug 20381
++ <https://sourceware.org/bugzilla/show_bug.cgi?id=20381>. */
++ if (setlocale (LC_ALL, "el_GR.iso88597")
++ || setlocale (LC_ALL, "el_GR.ISO8859-7")
++ || setlocale (LC_ALL, "el_GR.iso8859-7"))
++ {
++ /* Check this only in Greek locales that seem to be working.
++ In macOS 26, for example, setlocale (LC_ALL, "el_GR.ISO8859-7")
++ succeed but acts like the C locale. */
++ if (toupper (0xf2) == 0xd3 && toupper (0xf3) == 0xd3)
++ for (int i = 0; i < 3; i++)
++ for (int j = 0; j < 3; j++)
++ {
++ static char const str[3][2] = { "\xd3", "\xf2", "\xf3" };
++ regex_t re;
++ int err = regcomp (&re, str[i], REG_ICASE | REG_NOSUB);
++ if (err)
++ {
++ result |= 64;
++ continue;
++ }
++
++ int with = regexec (&re, str[j], 0, NULL, 0);
++ free (re.fastmap);
++ re.fastmap = NULL;
++ re.fastmap_accurate = 0;
++ int without = regexec (&re, str[j], 0, NULL, 0);
++ if (with != without)
++ result |= 64;
++
++ regfree (&re);
++ }
++
++ if (! setlocale (LC_ALL, "C"))
++ return 64;
++ }
++
+ #if 0
+ /* It would be nice to reject hosts whose regoff_t values are too
+ narrow (including glibc on hosts with 64-bit ptrdiff_t and
+--
+2.55.0
+
diff --git a/coreutils-df-direct.patch b/coreutils-df-direct.patch
index 04d8295..c99e81f 100644
--- a/coreutils-df-direct.patch
+++ b/coreutils-df-direct.patch
@@ -1,4 +1,4 @@
-From b94d9843a82dc187df0720636cbfcc6b6163cba8 Mon Sep 17 00:00:00 2001
+From b73fecbe4730fe94d2849d95f7fa56356ce621d3 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Mon, 29 Mar 2010 17:20:34 +0000
Subject: [PATCH] coreutils-df-direct.patch
@@ -12,10 +12,10 @@ Subject: [PATCH] coreutils-df-direct.patch
create mode 100755 tests/df/direct.sh
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
-index 0f9d3e27..dd77f03d 100644
+index 46854db..1bd6976 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
-@@ -12007,6 +12007,12 @@ some systems (notably Solaris), doing this yields more up to date results,
+@@ -12067,6 +12067,12 @@ some systems (notably Solaris), doing this yields more up to date results,
but in general this option makes @command{df} much slower, especially when
there are many or very busy file systems.
@@ -29,7 +29,7 @@ index 0f9d3e27..dd77f03d 100644
@cindex grand total of file system size, usage and available space
Print a grand total of all arguments after all arguments have
diff --git a/src/df.c b/src/df.c
-index f41ba3a8..6b23df75 100644
+index b3d83f5..f0c5f09 100644
--- a/src/df.c
+++ b/src/df.c
@@ -122,6 +122,9 @@ static bool print_type;
@@ -126,7 +126,7 @@ index f41ba3a8..6b23df75 100644
if (posix_format)
diff --git a/tests/df/direct.sh b/tests/df/direct.sh
new file mode 100755
-index 00000000..8373705a
+index 0000000..8373705
--- /dev/null
+++ b/tests/df/direct.sh
@@ -0,0 +1,55 @@
@@ -186,10 +186,10 @@ index 00000000..8373705a
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
-index 628e5443..e2c07a89 100644
+index e21c111..b3e45c4 100644
--- a/tests/local.mk
+++ b/tests/local.mk
-@@ -610,6 +610,7 @@ all_tests = \
+@@ -634,6 +634,7 @@ all_tests = \
tests/df/no-mtab-status-masked-proc.sh \
tests/df/skip-duplicates.sh \
tests/df/skip-rootfs.sh \
@@ -198,5 +198,5 @@ index 628e5443..e2c07a89 100644
tests/dd/conv-case.sh \
tests/dd/direct.sh \
--
-2.54.0
+2.55.0
diff --git a/coreutils-i18n.patch b/coreutils-i18n.patch
index 9369d5f..5bfbdf1 100644
--- a/coreutils-i18n.patch
+++ b/coreutils-i18n.patch
@@ -1,10 +1,9 @@
-From 67fbff3f5ed434d43ca0854ca2eb43bddfa5d5d1 Mon Sep 17 00:00:00 2001
+From e88ad93f8fdc08d383330477b6fa335ec8008583 Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Wed, 30 Aug 2023 17:19:58 +0200
Subject: [PATCH] coreutils-i18n.patch
---
- lib/linebuffer.h | 8 +
src/pr.c | 443 ++++++++++++++++++--
src/sort.c | 791 +++++++++++++++++++++++++++++++++---
tests/Coreutils.pm | 3 +
@@ -14,38 +13,12 @@ Subject: [PATCH] coreutils-i18n.patch
tests/pr/pr-tests.pl | 49 +++
tests/sort/sort-merge.pl | 42 ++
tests/sort/sort.pl | 40 +-
- 10 files changed, 1358 insertions(+), 94 deletions(-)
+ 9 files changed, 1350 insertions(+), 94 deletions(-)
create mode 100644 tests/i18n/sort.sh
create mode 100644 tests/misc/sort-mb-tests.sh
-diff --git a/lib/linebuffer.h b/lib/linebuffer.h
-index af22d27b..80119f4b 100644
---- a/lib/linebuffer.h
-+++ b/lib/linebuffer.h
-@@ -27,6 +27,11 @@ extern "C" {
- #endif
-
-
-+/* Get mbstate_t. */
-+# if HAVE_WCHAR_H
-+# include <wchar.h>
-+# endif
-+
- /* A 'struct linebuffer' holds a line of text. */
-
- struct linebuffer
-@@ -34,6 +39,9 @@ struct linebuffer
- idx_t size; /* Allocated. */
- idx_t length; /* Used. */
- char *buffer;
-+# if HAVE_WCHAR_H
-+ mbstate_t state;
-+# endif
- };
-
- /* Initialize linebuffer LINEBUFFER for use. */
diff --git a/src/pr.c b/src/pr.c
-index 09a1b94a..53f0bc57 100644
+index c3e085b..0989fcd 100644
--- a/src/pr.c
+++ b/src/pr.c
@@ -311,6 +311,24 @@
@@ -650,7 +623,7 @@ index 09a1b94a..53f0bc57 100644
{
width = TAB_WIDTH (chars_per_c, input_position);
-@@ -2737,6 +2936,164 @@ char_to_clump (char c)
+@@ -2740,6 +2939,164 @@ char_to_clump (char c)
return chars;
}
@@ -816,7 +789,7 @@ index 09a1b94a..53f0bc57 100644
looking for more options and printing the next batch of files.
diff --git a/src/sort.c b/src/sort.c
-index 510c674d..3f42ed40 100644
+index c0c5c22..323151a 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -29,6 +29,15 @@
@@ -876,7 +849,7 @@ index 510c674d..3f42ed40 100644
/* The kind of blanks for '-b' to skip in various options. */
enum blanktype { bl_start, bl_end, bl_both };
-@@ -333,13 +367,11 @@ static bool stable;
+@@ -343,13 +377,11 @@ static bool stable;
/* An int value outside char range. */
enum { NON_CHAR = CHAR_MAX + 1 };
@@ -893,7 +866,7 @@ index 510c674d..3f42ed40 100644
/* Flag to remove consecutive duplicate lines from the output.
Only the last of a sequence of equal lines will be output. */
-@@ -375,6 +407,46 @@ struct tempnode
+@@ -385,6 +417,46 @@ struct tempnode
static struct tempnode *volatile temphead;
static struct tempnode *volatile *temptail = &temphead;
@@ -940,7 +913,7 @@ index 510c674d..3f42ed40 100644
/* Clean up any remaining temporary files. */
static void
-@@ -1382,7 +1454,7 @@ zaptemp (char const *name)
+@@ -1392,7 +1464,7 @@ zaptemp (char const *name)
free (node);
}
@@ -949,7 +922,7 @@ index 510c674d..3f42ed40 100644
static int
struct_month_cmp (void const *m1, void const *m2)
-@@ -1397,7 +1469,7 @@ struct_month_cmp (void const *m1, void const *m2)
+@@ -1407,7 +1479,7 @@ struct_month_cmp (void const *m1, void const *m2)
/* Initialize the character class tables. */
static void
@@ -958,7 +931,7 @@ index 510c674d..3f42ed40 100644
{
for (size_t i = 0; i < UCHAR_LIM; ++i)
{
-@@ -1407,7 +1479,7 @@ inittables (void)
+@@ -1417,7 +1489,7 @@ inittables (void)
fold_toupper[i] = toupper (i);
}
@@ -967,7 +940,7 @@ index 510c674d..3f42ed40 100644
/* If we're not in the "C" locale, read different names for months. */
if (hard_LC_TIME)
{
-@@ -1487,6 +1559,84 @@ specify_nmerge (int oi, char c, char const *s)
+@@ -1497,6 +1569,84 @@ specify_nmerge (int oi, char c, char const *s)
xstrtol_fatal (e, oi, c, long_options, s);
}
@@ -1052,7 +1025,7 @@ index 510c674d..3f42ed40 100644
/* Specify the amount of main memory to use when sorting. */
static void
specify_sort_size (int oi, char c, char const *s)
-@@ -1713,7 +1863,7 @@ buffer_linelim (struct buffer const *buf)
+@@ -1860,7 +2010,7 @@ maybe_growbuf (struct buffer *buf, struct sort_buffer_policy *policy)
by KEY in LINE. */
static char *
@@ -1061,7 +1034,7 @@ index 510c674d..3f42ed40 100644
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t sword = key->sword;
-@@ -1722,10 +1872,10 @@ begfield (struct line const *line, struct keyfield const *key)
+@@ -1869,10 +2019,10 @@ begfield (struct line const *line, struct keyfield const *key)
/* The leading field separator itself is included in a field when -t
is absent. */
@@ -1074,7 +1047,7 @@ index 510c674d..3f42ed40 100644
ptr = sep ? sep : lim;
if (ptr < lim)
++ptr;
-@@ -1755,12 +1905,71 @@ begfield (struct line const *line, struct keyfield const *key)
+@@ -1902,12 +2052,71 @@ begfield (struct line const *line, struct keyfield const *key)
return ptr;
}
@@ -1147,7 +1120,7 @@ index 510c674d..3f42ed40 100644
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t eword = key->eword, echar = key->echar;
-@@ -1775,10 +1984,10 @@ limfield (struct line const *line, struct keyfield const *key)
+@@ -1922,10 +2131,10 @@ limfield (struct line const *line, struct keyfield const *key)
'beginning' is the first character following the delimiting TAB.
Otherwise, leave PTR pointing at the first 'blank' character after
the preceding field. */
@@ -1160,7 +1133,7 @@ index 510c674d..3f42ed40 100644
ptr = sep ? sep : lim;
if (ptr < lim && (eword || echar))
++ptr;
-@@ -1824,10 +2033,10 @@ limfield (struct line const *line, struct keyfield const *key)
+@@ -1971,10 +2180,10 @@ limfield (struct line const *line, struct keyfield const *key)
*/
/* Make LIM point to the end of (one byte past) the current field. */
@@ -1173,7 +1146,7 @@ index 510c674d..3f42ed40 100644
if (newlim)
lim = newlim;
}
-@@ -1862,6 +2071,130 @@ limfield (struct line const *line, struct keyfield const *key)
+@@ -2009,6 +2218,130 @@ limfield (struct line const *line, struct keyfield const *key)
return ptr;
}
@@ -1304,7 +1277,7 @@ index 510c674d..3f42ed40 100644
/* Fill BUF reading from FP, moving buf->left bytes from the end
of buf->buf to the beginning first. If EOF is reached and the
file wasn't terminated by a newline, supply one. Set up BUF's line
-@@ -1948,8 +2281,22 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file)
+@@ -2096,8 +2429,22 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file,
else
{
if (key->skipsblanks)
@@ -1329,7 +1302,7 @@ index 510c674d..3f42ed40 100644
line->keybeg = line_start;
}
}
-@@ -2087,12 +2434,10 @@ find_unit_order (char const *number)
+@@ -2237,12 +2584,10 @@ find_unit_order (char const *number)
ATTRIBUTE_PURE
static int
@@ -1345,7 +1318,7 @@ index 510c674d..3f42ed40 100644
int diff = find_unit_order (a) - find_unit_order (b);
return (diff ? diff : strnumcmp (a, b, decimal_point, thousands_sep));
-@@ -2104,7 +2449,7 @@ human_numcompare (char const *a, char const *b)
+@@ -2254,7 +2599,7 @@ human_numcompare (char const *a, char const *b)
ATTRIBUTE_PURE
static int
@@ -1354,7 +1327,7 @@ index 510c674d..3f42ed40 100644
{
while (blanks[to_uchar (*a)])
a++;
-@@ -2114,6 +2459,25 @@ numcompare (char const *a, char const *b)
+@@ -2264,6 +2609,25 @@ numcompare (char const *a, char const *b)
return strnumcmp (a, b, decimal_point, thousands_sep);
}
@@ -1380,7 +1353,7 @@ index 510c674d..3f42ed40 100644
static int
nan_compare (long double a, long double b)
{
-@@ -2155,7 +2519,7 @@ general_numcompare (char const *sa, char const *sb)
+@@ -2305,7 +2669,7 @@ general_numcompare (char const *sa, char const *sb)
Return 0 if the name in S is not recognized. */
static int
@@ -1389,7 +1362,7 @@ index 510c674d..3f42ed40 100644
{
size_t lo = 0;
size_t hi = MONTHS_PER_YEAR;
-@@ -2494,15 +2858,14 @@ debug_key (struct line const *line, struct keyfield const *key)
+@@ -2652,15 +3016,14 @@ debug_key (struct line const *line, struct keyfield const *key)
char saved = *lim;
*lim = '\0';
@@ -1407,7 +1380,7 @@ index 510c674d..3f42ed40 100644
else if (key->general_numeric)
ignore_value (strtold (beg, &tighter_lim));
else if (key->numeric || key->human_numeric)
-@@ -2647,7 +3010,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
+@@ -2805,7 +3168,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
/* Warn about significant leading blanks. */
bool implicit_skip = key_numeric (key) || key->month;
bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */
@@ -1416,7 +1389,7 @@ index 510c674d..3f42ed40 100644
&& ((!key->skipsblanks && !implicit_skip)
|| (!key->skipsblanks && key->schar)
|| (!key->skipeblanks && key->echar)))
-@@ -2695,9 +3058,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
+@@ -2853,9 +3216,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
bool number_locale_warned = false;
if (basic_numeric_field_span)
{
@@ -1429,7 +1402,7 @@ index 510c674d..3f42ed40 100644
{
error (0, 0,
_("field separator %s is treated as a "
-@@ -2708,9 +3071,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
+@@ -2866,9 +3229,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
}
if (basic_numeric_field_span || general_numeric_field_span)
{
@@ -1442,7 +1415,7 @@ index 510c674d..3f42ed40 100644
{
error (0, 0,
_("field separator %s is treated as a "
-@@ -2718,19 +3081,19 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
+@@ -2876,19 +3239,19 @@ key_warnings (struct keyfield const *gkey, bool gkey_only)
quote (((char []) {decimal_point, 0})));
number_locale_warned = true;
}
@@ -1466,7 +1439,7 @@ index 510c674d..3f42ed40 100644
}
}
-@@ -2782,11 +3145,87 @@ diff_reversed (int diff, bool reversed)
+@@ -2940,11 +3303,87 @@ diff_reversed (int diff, bool reversed)
return reversed ? _GL_CMP (0, diff) : diff;
}
@@ -1555,7 +1528,7 @@ index 510c674d..3f42ed40 100644
{
struct keyfield *key = keylist;
-@@ -2867,7 +3306,7 @@ keycompare (struct line const *a, struct line const *b)
+@@ -3025,7 +3464,7 @@ keycompare (struct line const *a, struct line const *b)
else if (key->human_numeric)
diff = human_numcompare (ta, tb);
else if (key->month)
@@ -1564,7 +1537,7 @@ index 510c674d..3f42ed40 100644
else if (key->random)
diff = compare_random (ta, tlena, tb, tlenb);
else if (key->version)
-@@ -2977,6 +3416,211 @@ keycompare (struct line const *a, struct line const *b)
+@@ -3135,6 +3574,211 @@ keycompare (struct line const *a, struct line const *b)
return diff_reversed (diff, key->reverse);
}
@@ -1776,7 +1749,7 @@ index 510c674d..3f42ed40 100644
/* Compare two lines A and B, returning negative, zero, or positive
depending on whether A compares less than, equal to, or greater than B. */
-@@ -3004,7 +3648,7 @@ compare (struct line const *a, struct line const *b)
+@@ -3162,7 +3806,7 @@ compare (struct line const *a, struct line const *b)
diff = - NONZERO (blen);
else if (blen == 0)
diff = 1;
@@ -1785,7 +1758,7 @@ index 510c674d..3f42ed40 100644
{
/* xmemcoll0 is a performance enhancement as
it will not unconditionally write '\0' after the
-@@ -4382,6 +5026,7 @@ set_ordering (char const *s, struct keyfield *key, enum blanktype blanktype)
+@@ -4547,6 +5191,7 @@ set_ordering (char const *s, struct keyfield *key, enum blanktype blanktype)
break;
case 'f':
key->translate = fold_toupper;
@@ -1793,7 +1766,7 @@ index 510c674d..3f42ed40 100644
break;
case 'g':
key->general_numeric = true;
-@@ -4461,7 +5106,7 @@ main (int argc, char **argv)
+@@ -4626,7 +5271,7 @@ main (int argc, char **argv)
initialize_exit_failure (SORT_FAILURE);
hard_LC_COLLATE = hard_locale (LC_COLLATE);
@@ -1802,7 +1775,7 @@ index 510c674d..3f42ed40 100644
hard_LC_TIME = hard_locale (LC_TIME);
#endif
-@@ -4484,6 +5129,29 @@ main (int argc, char **argv)
+@@ -4649,6 +5294,29 @@ main (int argc, char **argv)
thousands_sep = NON_CHAR;
}
@@ -1832,7 +1805,7 @@ index 510c674d..3f42ed40 100644
inittables ();
{
-@@ -4729,13 +5397,34 @@ main (int argc, char **argv)
+@@ -4894,13 +5562,34 @@ main (int argc, char **argv)
case 't':
{
@@ -1871,7 +1844,7 @@ index 510c674d..3f42ed40 100644
else
{
/* Provoke with 'sort -txx'. Complain about
-@@ -4746,9 +5435,11 @@ main (int argc, char **argv)
+@@ -4911,9 +5600,11 @@ main (int argc, char **argv)
quote (optarg));
}
}
@@ -1886,7 +1859,7 @@ index 510c674d..3f42ed40 100644
break;
diff --git a/tests/Coreutils.pm b/tests/Coreutils.pm
-index e396d93a..cba2e4ae 100644
+index fca22a6..b40745f 100644
--- a/tests/Coreutils.pm
+++ b/tests/Coreutils.pm
@@ -273,6 +273,9 @@ sub run_tests ($$$$$)
@@ -1901,7 +1874,7 @@ index e396d93a..cba2e4ae 100644
warn "$program_name: $test_name: test name is too long (> $max)\n";
diff --git a/tests/i18n/sort.sh b/tests/i18n/sort.sh
new file mode 100644
-index 00000000..26c95de9
+index 0000000..26c95de
--- /dev/null
+++ b/tests/i18n/sort.sh
@@ -0,0 +1,29 @@
@@ -1935,10 +1908,10 @@ index 00000000..26c95de9
+
+Exit $fail
diff --git a/tests/local.mk b/tests/local.mk
-index e2c07a89..d8a207ca 100644
+index b3e45c4..c875e50 100644
--- a/tests/local.mk
+++ b/tests/local.mk
-@@ -435,6 +435,8 @@ all_tests = \
+@@ -456,6 +456,8 @@ all_tests = \
tests/sort/sort-field-limit.sh \
tests/sort/sort-files0-from.pl \
tests/sort/sort-float.sh \
@@ -1949,7 +1922,7 @@ index e2c07a89..d8a207ca 100644
tests/sort/sort-merge.pl \
diff --git a/tests/misc/sort-mb-tests.sh b/tests/misc/sort-mb-tests.sh
new file mode 100644
-index 00000000..11836baa
+index 0000000..11836ba
--- /dev/null
+++ b/tests/misc/sort-mb-tests.sh
@@ -0,0 +1,45 @@
@@ -1999,7 +1972,7 @@ index 00000000..11836baa
+
+Exit $fail
diff --git a/tests/pr/pr-tests.pl b/tests/pr/pr-tests.pl
-index 812e215a..888df418 100755
+index 812e215..08b556b 100755
--- a/tests/pr/pr-tests.pl
+++ b/tests/pr/pr-tests.pl
@@ -24,6 +24,15 @@ use strict;
@@ -2048,7 +2021,7 @@ index 812e215a..888df418 100755
+ push @$t, $sub;
+ }
+ #temporarily skip some failing tests
-+ next if ($test_name =~ "col-0" or $test_name =~ "col-inval" or $test_name =~ "asan1");
++ next if ($test_name =~ "col-0" or $test_name =~ "col-inval" or $test_name =~ "asan1" or $test_name =~ "neg-page");
+ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}];
+ }
+ push @Tests, @new;
@@ -2068,7 +2041,7 @@ index 812e215a..888df418 100755
my $verbose = $ENV{VERBOSE};
diff --git a/tests/sort/sort-merge.pl b/tests/sort/sort-merge.pl
-index 33824790..fb4702c3 100755
+index 16a6b03..97a191f 100755
--- a/tests/sort/sort-merge.pl
+++ b/tests/sort/sort-merge.pl
@@ -26,6 +26,15 @@ my $prog = 'sort';
@@ -2087,8 +2060,8 @@ index 33824790..fb4702c3 100755
# three empty files and one that says 'foo'
my @inputs = (+(map{{IN=> {"empty$_"=> ''}}}1..3), {IN=> {foo=> "foo\n"}});
-@@ -77,6 +86,39 @@ my @Tests =
- {OUT=>$big_input}],
+@@ -87,6 +96,39 @@ my @Tests =
+ {OUT=>$long_lines_in}],
);
+# Add _POSIX2_VERSION=199209 to the environment of each test
@@ -2128,7 +2101,7 @@ index 33824790..fb4702c3 100755
my $verbose = $ENV{VERBOSE};
diff --git a/tests/sort/sort.pl b/tests/sort/sort.pl
-index e37a746e..3554beab 100755
+index 529edef..409a9b6 100755
--- a/tests/sort/sort.pl
+++ b/tests/sort/sort.pl
@@ -24,10 +24,15 @@ my $prog = 'sort';
@@ -2148,7 +2121,7 @@ index e37a746e..3554beab 100755
# Since each test is run with a file name and with redirected stdin,
# the name in the diagnostic is either the file name or "-".
# Normalize each diagnostic to use '-'.
-@@ -428,6 +433,38 @@ foreach my $t (@Tests)
+@@ -439,6 +444,38 @@ foreach my $t (@Tests)
}
}
@@ -2177,7 +2150,7 @@ index e37a746e..3554beab 100755
+ }
+ #disable several failing tests until investigation, disable all tests with envvars set
+ next if (grep {ref $_ eq 'HASH' && exists $_->{ENV}} (@new_t));
-+ next if ($test_name =~ "18g" or $test_name =~ "sort-numeric" or $test_name =~ "08[ab]" or $test_name =~ "03[def]" or $test_name =~ "h4" or $test_name =~ "n1" or $test_name =~ "2[01]a");
++ next if ($test_name =~ "18g" or $test_name =~ "sort-numeric" or $test_name =~ "08[ab]" or $test_name =~ "03[def]" or $test_name =~ "h4" or $test_name =~ "n1" or $test_name =~ "2[01]a" or $test_name =~ "invalid-parallel");
+ next if ($test_name =~ "11[ab]"); # avoid FP: expected result differs to MB result due to collation rules.
+ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}];
+ }
@@ -2187,7 +2160,7 @@ index e37a746e..3554beab 100755
@Tests = triple_test \@Tests;
# Remember that triple_test creates from each test with exactly one "IN"
-@@ -437,6 +474,7 @@ foreach my $t (@Tests)
+@@ -448,6 +485,7 @@ foreach my $t (@Tests)
# Remove the IN_PIPE version of the "output-is-input" test above.
# The others aren't susceptible because they have three inputs each.
@Tests = grep {$_->[0] ne 'output-is-input.p'} @Tests;
@@ -2196,5 +2169,5 @@ index e37a746e..3554beab 100755
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
--
-2.54.0
+2.55.0
diff --git a/coreutils-python3.patch b/coreutils-python3.patch
index be536a5..f52e2f3 100644
--- a/coreutils-python3.patch
+++ b/coreutils-python3.patch
@@ -1,4 +1,4 @@
-From ba882f9ed1f26211493df4bfc0c6cfc13562fb6c Mon Sep 17 00:00:00 2001
+From f4bd5c152037e265d59549cda59ff0d610088677 Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Tue, 2 Apr 2024 14:11:26 +0100
Subject: [PATCH] coreutils-python3.patch
@@ -10,10 +10,10 @@ Subject: [PATCH] coreutils-python3.patch
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/init.cfg b/init.cfg
-index 2c6da89..4ddb0af 100644
+index 6add661..8ec3be9 100644
--- a/init.cfg
+++ b/init.cfg
-@@ -604,10 +604,10 @@ seek_data_capable_()
+@@ -632,10 +632,10 @@ seek_data_capable_()
# Skip the current test if "." lacks d_type support.
require_dirent_d_type_()
{
@@ -61,5 +61,5 @@ index 9639ac3..962e8e3 100755
import os,sys
--
-2.52.0
+2.55.0
diff --git a/coreutils.spec b/coreutils.spec
index caca7d2..a0d9f4d 100644
--- a/coreutils.spec
+++ b/coreutils.spec
@@ -1,7 +1,7 @@
Summary: A set of basic GNU tools commonly used in shell scripts
Name: coreutils
-Version: 9.11
-Release: 6%{?dist}
+Version: 9.12
+Release: 1%{?dist}
# some used parts of gnulib are under various variants of LGPL
License: GPL-3.0-or-later AND GFDL-1.3-no-invariants-or-later AND LGPL-2.1-or-later AND LGPL-3.0-or-later
Url: https://www.gnu.org/software/coreutils/
@@ -19,33 +19,26 @@ Source106: coreutils-colorls.csh
# do not make coreutils-single depend on /usr/bin/coreutils
%global __requires_exclude ^%{_bindir}/coreutils$
-# disable the test-lock gnulib test prone to deadlock
-Patch100: coreutils-8.26-test-lock.patch
-
# require_selinux_(): use selinuxenabled(8) if available
-Patch101: coreutils-8.26-selinuxenable.patch
+Patch100: coreutils-8.26-selinuxenable.patch
# downstream changes to default DIR_COLORS
-Patch102: coreutils-8.32-DIR_COLORS.patch
+Patch101: coreutils-8.32-DIR_COLORS.patch
# use python3 in tests
-Patch103: coreutils-python3.patch
+Patch102: coreutils-python3.patch
# df --direct
-Patch104: coreutils-df-direct.patch
-
-# unexpand: fix heap overflows
-# https://cgit.git.savannah.gnu.org/cgit/coreutils.git/commit/?id=b60a159fdc5bfcf9988d3a4cb6f53abe8ad5d35d
-# https://cgit.git.savannah.gnu.org/cgit/coreutils.git/commit/?id=4ade9cf77f6c7b39e3fdc5ce97a778f8e294694c
-Patch200: coreutils-9.11-unexpand-heap-overflows.patch
+Patch103: coreutils-df-direct.patch
-# CVE-2026-56391 - uniq: fix read overrun with -w
-# https://cgit.git.savannah.gnu.org/cgit/coreutils.git/commit/?id=d64e35a8a4c0e4608321433e0d84d917e4e36371
-Patch201: coreutils-9.11-CVE-2026-56391.patch
+# env,printenv: only quote when outputting to terminals
+# https://github.com/coreutils/coreutils/commit/782a1e5b
+Patch200: coreutils-9.12-env-quote-fix.patch
-# tee: fix infinite loop when write returns EAGAIN and short write errors
-# https://cgit.git.savannah.gnu.org/cgit/coreutils.git/commit/?id=0d6fcb99d691d920961938e61c43478566ef626e
-Patch202: coreutils-9.11-tee-infinite-loop.patch
+# regex: check for glibc greek locale bug 20381
+# fixes test failure with glibc-2.44.9000-2
+# https://github.com/coreutils/gnulib/commit/acc1d91810
+Patch201: coreutils-9.12-gnulib-regex-greek.patch
# (sb) lin18nux/lsb compliance - multibyte functionality patch
Patch800: coreutils-i18n.patch
@@ -79,6 +72,8 @@ BuildRequires: gnupg2
# test-only dependencies
BuildRequires: acl
BuildRequires: gdb
+BuildRequires: glibc-all-langpacks
+BuildRequires: glibc-gconv-extra
BuildRequires: perl-interpreter
BuildRequires: perl(FileHandle)
BuildRequires: perl(POSIX)
@@ -93,11 +88,6 @@ BuildRequires: perl(Expect)
BuildRequires: python3-inotify
%endif
-%if 23 < 0%{?fedora} || 7 < 0%{?rhel}
-# needed by i18n test-cases
-BuildRequires: glibc-all-langpacks
-%endif
-
Requires: %{name}-common = %{version}-%{release}
Provides: coreutils-full = %{version}-%{release}
@@ -171,12 +161,6 @@ find tests -name '*.sh' -perm 0644 -print -exec chmod 0755 '{}' '+'
# with coreutils 9.6 and bundled gettext 0.19.2 from gettext-common-devel.
sed -i "s/0.19.2/$(rpm -q --queryformat '%%{VERSION}\n' gettext-devel)/" bootstrap.conf configure.ac
-%if 0%{?rhel}
-# Temporarily disable test-getaddrinfo from gnulib because it malfunctions in
-# the environment used to bootstrap RHEL.
-sed -i 's/TESTS += test-getaddrinfo//' gnulib-tests/gnulib.mk
-%endif
-
autoreconf -fiv
%build
@@ -298,6 +282,9 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir
%license COPYING
%changelog
+* Mon Sep 21 2026 Lukáš Zaoral <lzaoral@redhat.com> - 9.12-1
+- rebase to the latest upstream release (rhbz#2533195)
+
* Mon Aug 03 2026 Lukáš Zaoral <lzaoral@redhat.com> - 9.11-6
- CVE-2026-56391 - uniq: fix read overrun with -w (rhbz#2507449)
- tee: fix infinite loop when write returns EAGAIN and short write errors
diff --git a/sources b/sources
index a61446b..de98e8e 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-SHA512 (coreutils-9.11.tar.xz) = 73f4192747ab793fd29cccafeda35c499a11800830227ea4d26b00afb2c496dd69cb493005691d0f62a168beea6b55c1e28e82b6cf795e7370f9d53d13555410
-SHA512 (coreutils-9.11.tar.xz.sig) = 63bd88bd5d2e0e453e22404bbc28e3aede0660aa6f213131a5d528b721f84985593727d453a4b8915172e8ad5711edc17a5d53b72f5c1c975df2f64f1a29a38c
+SHA512 (coreutils-9.12.tar.xz) = f25514cf02fd25365252d9a8f6fc5f8ed063fffdcb11c7eff380e3fa632741105d11b45ded332a2af5e913f77a143b68a2bd1fbdca0085e127fb17c80c35279b
+SHA512 (coreutils-9.12.tar.xz.sig) = d975e411edfd225679729d4496be029bd54b495f835b64f2ff75d00814b9dd5960c4459f4505c031a6967f1ce81c9d2a30eb9bc939e15421aba9461366f57e2d
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-21 9:28 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-21 9:28 [rpms/coreutils] rawhide: rebase to the latest upstream release
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox