diff --git a/backport-chmod-fix-exit-status-when-ignoring-symlinks.patch b/backport-chmod-fix-exit-status-when-ignoring-symlinks.patch deleted file mode 100644 index a5686058ab3e9ac890e9908014418ea67db85d33..0000000000000000000000000000000000000000 --- a/backport-chmod-fix-exit-status-when-ignoring-symlinks.patch +++ /dev/null @@ -1,90 +0,0 @@ -From e8b56ebd536e82b15542a00c888109471936bfda Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -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. -* NEWS: Mention the bug fix. -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 37b04f5006..57ac47f33a 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 0000000000..5ce3de8163 ---- /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 . -+ -+. "${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 228d0e3688..b5b893fb77 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 \ diff --git a/backport-coreutils-i18n.patch b/backport-coreutils-i18n.patch index c5a6c33ba78579da6c92d24fb17507c9c9dab975..1a0770bf838c00f984d31622400a67ee6eee3b99 100644 --- a/backport-coreutils-i18n.patch +++ b/backport-coreutils-i18n.patch @@ -1,4 +1,4 @@ -From d53e5b885b9d82e2d9ba5d65ed8fd9b96712623f Mon Sep 17 00:00:00 2001 +From 01010419a6499768563e7b2f3fd56cf16edda75e Mon Sep 17 00:00:00 2001 From: rpm-build Date: Mon, 4 Oct 2021 08:54:37 +0200 Subject: [PATCH] coreutils-i18n.patch @@ -10,16 +10,16 @@ Subject: [PATCH] coreutils-i18n.patch lib/mbfile.c | 3 + lib/mbfile.h | 255 ++++++++++++ m4/mbfile.m4 | 14 + - src/cut.c | 441 +++++++++++++++++++- + src/cut.c | 508 +++++++++++++++++++++-- src/expand-common.c | 114 ++++++ src/expand-common.h | 12 + - src/expand.c | 90 ++++- - src/fold.c | 312 +++++++++++++-- - src/join.c | 359 ++++++++++++++--- + src/expand.c | 90 +++- + src/fold.c | 312 ++++++++++++-- + src/join.c | 359 ++++++++++++++-- src/local.mk | 4 +- - src/pr.c | 443 +++++++++++++++++++-- - src/sort.c | 772 ++++++++++++++++++++++++++++++++++-- - src/unexpand.c | 101 ++++- + src/pr.c | 443 ++++++++++++++++++-- + src/sort.c | 792 +++++++++++++++++++++++++++++++++--- + src/unexpand.c | 102 ++++- src/uniq.c | 119 +++++- tests/Coreutils.pm | 3 + tests/expand/mb.sh | 183 +++++++++ @@ -28,14 +28,14 @@ Subject: [PATCH] coreutils-i18n.patch tests/misc/expand.pl | 42 ++ tests/misc/fold.pl | 50 ++- tests/misc/join.pl | 50 +++ - tests/misc/sort-mb-tests.sh | 45 +++ + tests/misc/sort-mb-tests.sh | 45 ++ tests/misc/sort-merge.pl | 42 ++ tests/misc/sort.pl | 40 +- tests/misc/unexpand.pl | 39 ++ tests/misc/uniq.pl | 55 +++ tests/pr/pr-tests.pl | 49 +++ tests/unexpand/mb.sh | 172 ++++++++ - 31 files changed, 3640 insertions(+), 213 deletions(-) + 31 files changed, 3699 insertions(+), 242 deletions(-) create mode 100644 lib/mbfile.c create mode 100644 lib/mbfile.h create mode 100644 m4/mbfile.m4 @@ -45,10 +45,10 @@ Subject: [PATCH] coreutils-i18n.patch create mode 100755 tests/unexpand/mb.sh diff --git a/bootstrap.conf b/bootstrap.conf -index aef9ec7..9486e9d 100644 +index c1399e3..60b39cf 100644 --- a/bootstrap.conf +++ b/bootstrap.conf -@@ -156,6 +156,7 @@ gnulib_modules=" +@@ -162,6 +162,7 @@ gnulib_modules=" maintainer-makefile malloc-gnu manywarnings @@ -57,10 +57,10 @@ index aef9ec7..9486e9d 100644 mbrtowc mbsalign diff --git a/configure.ac b/configure.ac -index 6960b48..8ff85f8 100644 +index 7e4afc9..4656a35 100644 --- a/configure.ac +++ b/configure.ac -@@ -457,6 +457,8 @@ fi +@@ -476,6 +476,8 @@ fi # I'm leaving it here for now. This whole thing needs to be modernized... gl_WINSIZE_IN_PTEM @@ -70,7 +70,7 @@ index 6960b48..8ff85f8 100644 if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no && \ diff --git a/lib/linebuffer.h b/lib/linebuffer.h -index 5fa5ad2..2bdbcab 100644 +index 07d45ca..af62e6c 100644 --- a/lib/linebuffer.h +++ b/lib/linebuffer.h @@ -22,6 +22,11 @@ @@ -386,7 +386,7 @@ index 0000000..8589902 + : +]) diff --git a/src/cut.c b/src/cut.c -index cdf33d8..b8301d7 100644 +index 6fd8978..faef877 100644 --- a/src/cut.c +++ b/src/cut.c @@ -28,6 +28,11 @@ @@ -483,23 +483,26 @@ index cdf33d8..b8301d7 100644 /* This buffer is used to support the semantics of the -s option (or lack of same) when the specified field list includes (does not include) the first field. In both of those cases, the entire -@@ -76,15 +142,25 @@ enum operating_mode - { - undefined_mode, +@@ -72,6 +138,29 @@ static char *field_1_buffer; + /* The number of bytes allocated for FIELD_1_BUFFER. */ + static size_t field_1_bufsize; -- /* Output characters that are in the given bytes. */ ++enum operating_mode ++ { ++ undefined_mode, ++ + /* Output bytes that are at the given positions. */ - byte_mode, - ++ byte_mode, ++ + /* Output characters that are at the given positions. */ + character_mode, + - /* Output the given delimiter-separated fields. */ - field_mode - }; - - static enum operating_mode operating_mode; - ++ /* Output the given delimiter-separated fields. */ ++ field_mode ++ }; ++ ++static enum operating_mode operating_mode; ++ +/* If nonzero, when in byte mode, don't split multibyte characters. */ +static int byte_mode_character_aware; + @@ -510,7 +513,7 @@ index cdf33d8..b8301d7 100644 /* If true do not output lines containing no delimiter characters. Otherwise, all such lines are printed. This option is valid only with field mode. */ -@@ -96,6 +172,9 @@ static bool complement; +@@ -83,10 +172,16 @@ static bool complement; /* The delimiter character for field mode. */ static unsigned char delim; @@ -520,7 +523,24 @@ index cdf33d8..b8301d7 100644 /* The delimiter for each line/record. */ static unsigned char line_delim = '\n'; -@@ -163,7 +242,7 @@ Print selected parts of lines from each FILE to standard output.\n\ + ++/* True if the --output-delimiter=STRING option was specified. */ ++static bool output_delimiter_specified; ++ + /* The length of output_delimiter_string. */ + static size_t output_delimiter_length; + +@@ -94,9 +189,6 @@ static size_t output_delimiter_length; + string consisting of the input delimiter. */ + static char *output_delimiter_string; + +-/* The output delimiter string contents, if the default. */ +-static char output_delimiter_default[1]; +- + /* True if we have ever read standard input. */ + static bool have_read_stdin; + +@@ -150,7 +242,7 @@ Print selected parts of lines from each FILE to standard output.\n\ -f, --fields=LIST select only these fields; also print any line\n\ that contains no delimiter character, unless\n\ the -s option is specified\n\ @@ -529,7 +549,16 @@ index cdf33d8..b8301d7 100644 "), stdout); fputs (_("\ --complement complement the set of selected bytes, characters\n\ -@@ -279,6 +358,82 @@ cut_bytes (FILE *stream) +@@ -250,7 +342,7 @@ cut_bytes (FILE *stream) + next_item (&byte_idx); + if (print_kth (byte_idx)) + { +- if (output_delimiter_string != output_delimiter_default) ++ if (output_delimiter_specified) + { + if (print_delimiter && is_range_start_index (byte_idx)) + { +@@ -266,6 +358,82 @@ cut_bytes (FILE *stream) } } @@ -612,10 +641,11 @@ index cdf33d8..b8301d7 100644 /* Read from stream STREAM, printing to standard output any selected fields. */ static void -@@ -424,13 +579,211 @@ cut_fields (FILE *stream) +@@ -411,11 +579,218 @@ cut_fields (FILE *stream) } } +-/* Process file FILE to standard output, using CUT_STREAM. +#if HAVE_MBRTOWC +static void +cut_fields_mb (FILE *stream) @@ -773,11 +803,9 @@ index cdf33d8..b8301d7 100644 +} +#endif + - static void - cut_stream (FILE *stream) - { -- if (operating_mode == byte_mode) -- cut_bytes (stream); ++static void ++cut_stream (FILE *stream) ++{ +#if HAVE_MBRTOWC + if (MB_CUR_MAX > 1 && !force_singlebyte_mode) + { @@ -815,8 +843,7 @@ index cdf33d8..b8301d7 100644 + abort (); + } + } - else -- cut_fields (stream); ++ else +#endif + { + if (operating_mode == field_mode) @@ -824,29 +851,51 @@ index cdf33d8..b8301d7 100644 + else + cut_bytes (stream); + } - } ++} ++ ++/* Process file FILE to standard output. + Return true if successful. */ + + static bool +-cut_file (char const *file, void (*cut_stream) (FILE *)) ++cut_file (char const *file) + { + FILE *stream; - /* Process file FILE to standard output. -@@ -482,6 +835,7 @@ main (int argc, char **argv) +@@ -459,8 +834,8 @@ main (int argc, char **argv) + int optc; bool ok; bool delim_specified = false; - char *spec_list_string IF_LINT ( = NULL); +- bool byte_mode = false; +- char *spec_list_string = NULL; ++ char *spec_list_string IF_LINT ( = NULL); + char mbdelim[MB_LEN_MAX + 1]; initialize_main (&argc, &argv); set_program_name (argv[0]); -@@ -504,7 +858,6 @@ main (int argc, char **argv) +@@ -470,6 +845,8 @@ main (int argc, char **argv) + + atexit (close_stdout); + ++ operating_mode = undefined_mode; ++ + /* By default, all non-delimited lines are printed. */ + suppress_non_delimited = false; + +@@ -481,35 +858,77 @@ main (int argc, char **argv) switch (optc) { case 'b': - case 'c': /* Build the byte list. */ - if (operating_mode != undefined_mode) - FATAL_ERROR (_("only one type of list may be specified")); -@@ -512,6 +865,14 @@ main (int argc, char **argv) - spec_list_string = optarg; - break; - +- byte_mode = true; +- FALLTHROUGH; ++ if (operating_mode != undefined_mode) ++ FATAL_ERROR (_("only one type of list may be specified")); ++ operating_mode = byte_mode; ++ spec_list_string = optarg; ++ break; ++ + case 'c': + /* Build the character list. */ + if (operating_mode != undefined_mode) @@ -857,8 +906,14 @@ index cdf33d8..b8301d7 100644 + case 'f': /* Build the field list. */ - if (operating_mode != undefined_mode) -@@ -523,10 +884,38 @@ main (int argc, char **argv) +- if (spec_list_string) +- FATAL_ERROR (_("only one list may be specified")); ++ if (operating_mode != undefined_mode) ++ FATAL_ERROR (_("only one type of list may be specified")); ++ operating_mode = field_mode; + spec_list_string = optarg; + break; + case 'd': /* New delimiter. */ /* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */ @@ -901,7 +956,13 @@ index cdf33d8..b8301d7 100644 break; case OUTPUT_DELIMITER_OPTION: -@@ -539,6 +928,7 @@ main (int argc, char **argv) ++ output_delimiter_specified = true; + /* Interpret --output-delimiter='' to mean + 'use the NUL byte as the delimiter.' */ + output_delimiter_length = (optarg[0] == '\0' + ? 1 : strlen (optarg)); +- output_delimiter_string = optarg; ++ output_delimiter_string = xstrdup (optarg); break; case 'n': @@ -909,8 +970,34 @@ index cdf33d8..b8301d7 100644 break; case 's': -@@ -578,15 +968,34 @@ main (int argc, char **argv) - | (complement ? SETFLD_COMPLEMENT : 0) ); +@@ -533,40 +952,57 @@ main (int argc, char **argv) + } + } + +- if (!spec_list_string) ++ if (operating_mode == undefined_mode) + FATAL_ERROR (_("you must specify a list of bytes, characters, or fields")); + +- if (byte_mode) +- { +- if (delim_specified) +- FATAL_ERROR (_("an input delimiter may be specified only\ ++ if (delim_specified && operating_mode != field_mode) ++ FATAL_ERROR (_("an input delimiter may be specified only\ + when operating on fields")); + +- if (suppress_non_delimited) +- FATAL_ERROR (_("suppressing non-delimited lines makes sense\n\ ++ if (suppress_non_delimited && operating_mode != field_mode) ++ FATAL_ERROR (_("suppressing non-delimited lines makes sense\n\ + \tonly when operating on fields")); +- } + + set_fields (spec_list_string, +- ((byte_mode ? SETFLD_ERRMSG_USE_POS : 0) +- | (complement ? SETFLD_COMPLEMENT : 0))); ++ ( (operating_mode == field_mode) ? 0 : SETFLD_ERRMSG_USE_POS) ++ | (complement ? SETFLD_COMPLEMENT : 0) ); if (!delim_specified) - delim = '\t'; @@ -926,10 +1013,8 @@ index cdf33d8..b8301d7 100644 if (output_delimiter_string == NULL) { -- static char dummy[2]; -- dummy[0] = delim; -- dummy[1] = '\0'; -- output_delimiter_string = dummy; +- output_delimiter_default[0] = delim; +- output_delimiter_string = output_delimiter_default; - output_delimiter_length = 1; +#ifdef HAVE_MBRTOWC + if (MB_CUR_MAX > 1 && !force_singlebyte_mode) @@ -949,9 +1034,19 @@ index cdf33d8..b8301d7 100644 + } } +- void (*cut_stream) (FILE *) = byte_mode ? cut_bytes : cut_fields; if (optind == argc) +- ok = cut_file ("-", cut_stream); ++ ok = cut_file ("-"); + else + for (ok = true; optind < argc; optind++) +- ok &= cut_file (argv[optind], cut_stream); ++ ok &= cut_file (argv[optind]); + + + if (have_read_stdin && fclose (stdin) == EOF) diff --git a/src/expand-common.c b/src/expand-common.c -index 4deb7bd..8fd0524 100644 +index deec1bd..b39f740 100644 --- a/src/expand-common.c +++ b/src/expand-common.c @@ -19,6 +19,7 @@ @@ -1083,7 +1178,7 @@ index 4deb7bd..8fd0524 100644 to the list of tab stops. */ extern void diff --git a/src/expand-common.h b/src/expand-common.h -index ac812d0..16789ab 100644 +index 5f59a0e..835b9d5 100644 --- a/src/expand-common.h +++ b/src/expand-common.h @@ -25,6 +25,18 @@ extern size_t max_column_width; @@ -1106,7 +1201,7 @@ index ac812d0..16789ab 100644 extern void add_tab_stop (uintmax_t tabval); diff --git a/src/expand.c b/src/expand.c -index 4e32bfc..902c6b4 100644 +index ed78ca8..a4cefa1 100644 --- a/src/expand.c +++ b/src/expand.c @@ -37,6 +37,9 @@ @@ -1262,7 +1357,7 @@ index 4e32bfc..902c6b4 100644 } diff --git a/src/fold.c b/src/fold.c -index 94a6d37..a278783 100644 +index f07a90b..d32dbfd 100644 --- a/src/fold.c +++ b/src/fold.c @@ -22,12 +22,34 @@ @@ -1668,7 +1763,7 @@ index 94a6d37..a278783 100644 case 's': /* Break at word boundaries. */ diff --git a/src/join.c b/src/join.c -index f22ffda..ad5dc0d 100644 +index f2fd172..6c7d1ed 100644 --- a/src/join.c +++ b/src/join.c @@ -22,19 +22,33 @@ @@ -1723,7 +1818,7 @@ index f22ffda..ad5dc0d 100644 /* If nonzero, check that the input is correctly ordered. */ static enum -@@ -276,13 +292,14 @@ xfields (struct line *line) +@@ -280,13 +296,14 @@ xfields (struct line *line) if (ptr == lim) return; @@ -1741,7 +1836,7 @@ index f22ffda..ad5dc0d 100644 { /* Skip leading blanks before the first field. */ while (field_sep (*ptr)) -@@ -306,6 +323,147 @@ xfields (struct line *line) +@@ -310,6 +327,147 @@ xfields (struct line *line) extract_field (line, ptr, lim - ptr); } @@ -1889,7 +1984,7 @@ index f22ffda..ad5dc0d 100644 static void freeline (struct line *line) { -@@ -327,56 +485,133 @@ keycmp (struct line const *line1, struct line const *line2, +@@ -331,56 +489,133 @@ keycmp (struct line const *line1, struct line const *line2, size_t jf_1, size_t jf_2) { /* Start of field to compare in each file. */ @@ -2046,7 +2141,7 @@ index f22ffda..ad5dc0d 100644 } /* Check that successive input lines PREV and CURRENT from input file -@@ -468,6 +703,11 @@ get_line (FILE *fp, struct line **linep, int which) +@@ -472,6 +707,11 @@ get_line (FILE *fp, struct line **linep, int which) } ++line_no[which - 1]; @@ -2058,7 +2153,7 @@ index f22ffda..ad5dc0d 100644 xfields (line); if (prevline[which - 1]) -@@ -563,21 +803,28 @@ prfield (size_t n, struct line const *line) +@@ -567,21 +807,28 @@ prfield (size_t n, struct line const *line) /* Output all the fields in line, other than the join field. */ @@ -2090,7 +2185,7 @@ index f22ffda..ad5dc0d 100644 prfield (i, line); } } -@@ -588,7 +835,6 @@ static void +@@ -592,7 +839,6 @@ static void prjoin (struct line const *line1, struct line const *line2) { const struct outlist *outlist; @@ -2098,7 +2193,7 @@ index f22ffda..ad5dc0d 100644 size_t field; struct line const *line; -@@ -622,7 +868,7 @@ prjoin (struct line const *line1, struct line const *line2) +@@ -626,7 +872,7 @@ prjoin (struct line const *line1, struct line const *line2) o = o->next; if (o == NULL) break; @@ -2107,7 +2202,7 @@ index f22ffda..ad5dc0d 100644 } putchar (eolchar); } -@@ -1098,20 +1344,43 @@ main (int argc, char **argv) +@@ -1102,20 +1348,43 @@ main (int argc, char **argv) case 't': { @@ -2161,10 +2256,10 @@ index f22ffda..ad5dc0d 100644 break; diff --git a/src/local.mk b/src/local.mk -index 0c8b65d..011421a 100644 +index e1d15ce..1a5ffaa 100644 --- a/src/local.mk +++ b/src/local.mk -@@ -429,8 +429,8 @@ src_base32_CPPFLAGS = -DBASE_TYPE=32 $(AM_CPPFLAGS) +@@ -434,8 +434,8 @@ src_base32_CPPFLAGS = -DBASE_TYPE=32 $(AM_CPPFLAGS) src_basenc_SOURCES = src/basenc.c src_basenc_CPPFLAGS = -DBASE_TYPE=42 $(AM_CPPFLAGS) @@ -2176,7 +2271,7 @@ index 0c8b65d..011421a 100644 src_wc_SOURCES = src/wc.c if USE_AVX2_WC_LINECOUNT diff --git a/src/pr.c b/src/pr.c -index 8f84d0f..4bb5195 100644 +index 4c17c00..b4fab1c 100644 --- a/src/pr.c +++ b/src/pr.c @@ -311,6 +311,24 @@ @@ -2314,7 +2409,7 @@ index 8f84d0f..4bb5195 100644 static char *column_separator = (char *) " "; static char *line_separator = (char *) "\t"; -@@ -852,6 +905,13 @@ separator_string (char const *optarg_S) +@@ -853,6 +906,13 @@ separator_string (char const *optarg_S) integer_overflow (); col_sep_length = len; col_sep_string = optarg_S; @@ -2328,7 +2423,7 @@ index 8f84d0f..4bb5195 100644 } int -@@ -876,6 +936,21 @@ main (int argc, char **argv) +@@ -877,6 +937,21 @@ main (int argc, char **argv) atexit (close_stdout); @@ -2350,7 +2445,7 @@ index 8f84d0f..4bb5195 100644 n_files = 0; file_names = (argc > 1 ? xnmalloc (argc - 1, sizeof (char *)) -@@ -952,8 +1027,12 @@ main (int argc, char **argv) +@@ -953,8 +1028,12 @@ main (int argc, char **argv) break; case 'e': if (optarg) @@ -2365,7 +2460,7 @@ index 8f84d0f..4bb5195 100644 /* Could check tab width > 0. */ untabify_input = true; break; -@@ -966,8 +1045,12 @@ main (int argc, char **argv) +@@ -967,8 +1046,12 @@ main (int argc, char **argv) break; case 'i': if (optarg) @@ -2380,7 +2475,7 @@ index 8f84d0f..4bb5195 100644 /* Could check tab width > 0. */ tabify_output = true; break; -@@ -985,8 +1068,8 @@ main (int argc, char **argv) +@@ -986,8 +1069,8 @@ main (int argc, char **argv) case 'n': numbered_lines = true; if (optarg) @@ -2391,7 +2486,7 @@ index 8f84d0f..4bb5195 100644 break; case 'N': skip_count = false; -@@ -1011,6 +1094,7 @@ main (int argc, char **argv) +@@ -1012,6 +1095,7 @@ main (int argc, char **argv) /* Reset an additional input of -s, -S dominates -s */ col_sep_string = ""; col_sep_length = 0; @@ -2942,7 +3037,7 @@ index 8f84d0f..4bb5195 100644 looking for more options and printing the next batch of files. diff --git a/src/sort.c b/src/sort.c -index 5f4c817..bd9c672 100644 +index 3b775d6..a0ba243 100644 --- a/src/sort.c +++ b/src/sort.c @@ -29,6 +29,14 @@ @@ -2960,9 +3055,9 @@ index 5f4c817..bd9c672 100644 #include "system.h" #include "argmatch.h" #include "die.h" -@@ -157,14 +165,39 @@ static int decimal_point; - /* Thousands separator; if -1, then there isn't one. */ - static int thousands_sep; +@@ -159,14 +167,39 @@ static int thousands_sep; + /* We currently ignore multi-byte grouping chars. */ + static bool thousands_sep_ignored; +/* True if -f is specified. */ +static bool folding; @@ -3001,9 +3096,9 @@ index 5f4c817..bd9c672 100644 /* The kind of blanks for '-b' to skip in various options. */ enum blanktype { bl_start, bl_end, bl_both }; -@@ -338,13 +371,11 @@ static bool reverse; - they were read if all keys compare equal. */ - static bool stable; +@@ -343,13 +376,11 @@ static bool stable; + /* An int value outside char range. */ + enum { NON_CHAR = CHAR_MAX + 1 }; -/* If TAB has this value, blanks separate fields. */ -enum { TAB_DEFAULT = CHAR_MAX + 1 }; @@ -3018,7 +3113,7 @@ index 5f4c817..bd9c672 100644 /* Flag to remove consecutive duplicate lines from the output. Only the last of a sequence of equal lines will be output. */ -@@ -802,6 +833,46 @@ reap_all (void) +@@ -805,6 +836,46 @@ reap_all (void) reap (-1); } @@ -3065,7 +3160,7 @@ index 5f4c817..bd9c672 100644 /* Clean up any remaining temporary files. */ static void -@@ -1269,7 +1340,7 @@ zaptemp (char const *name) +@@ -1272,7 +1343,7 @@ zaptemp (char const *name) free (node); } @@ -3074,7 +3169,7 @@ index 5f4c817..bd9c672 100644 static int struct_month_cmp (void const *m1, void const *m2) -@@ -1284,7 +1355,7 @@ struct_month_cmp (void const *m1, void const *m2) +@@ -1287,7 +1358,7 @@ struct_month_cmp (void const *m1, void const *m2) /* Initialize the character class tables. */ static void @@ -3083,7 +3178,7 @@ index 5f4c817..bd9c672 100644 { size_t i; -@@ -1296,7 +1367,7 @@ inittables (void) +@@ -1299,7 +1370,7 @@ inittables (void) fold_toupper[i] = toupper (i); } @@ -3092,7 +3187,7 @@ index 5f4c817..bd9c672 100644 /* If we're not in the "C" locale, read different names for months. */ if (hard_LC_TIME) { -@@ -1378,6 +1449,84 @@ specify_nmerge (int oi, char c, char const *s) +@@ -1381,6 +1452,84 @@ specify_nmerge (int oi, char c, char const *s) xstrtol_fatal (e, oi, c, long_options, s); } @@ -3177,7 +3272,7 @@ index 5f4c817..bd9c672 100644 /* Specify the amount of main memory to use when sorting. */ static void specify_sort_size (int oi, char c, char const *s) -@@ -1609,7 +1758,7 @@ buffer_linelim (struct buffer const *buf) +@@ -1612,7 +1761,7 @@ buffer_linelim (struct buffer const *buf) by KEY in LINE. */ static char * @@ -3186,7 +3281,7 @@ index 5f4c817..bd9c672 100644 { char *ptr = line->text, *lim = ptr + line->length - 1; size_t sword = key->sword; -@@ -1618,10 +1767,10 @@ begfield (struct line const *line, struct keyfield const *key) +@@ -1621,10 +1770,10 @@ begfield (struct line const *line, struct keyfield const *key) /* The leading field separator itself is included in a field when -t is absent. */ @@ -3199,7 +3294,7 @@ index 5f4c817..bd9c672 100644 ++ptr; if (ptr < lim) ++ptr; -@@ -1647,11 +1796,70 @@ begfield (struct line const *line, struct keyfield const *key) +@@ -1650,12 +1799,71 @@ begfield (struct line const *line, struct keyfield const *key) return ptr; } @@ -3265,13 +3360,14 @@ index 5f4c817..bd9c672 100644 /* Return the limit of (a pointer to the first character after) the field in LINE specified by KEY. */ - static char * _GL_ATTRIBUTE_PURE + ATTRIBUTE_PURE + static char * -limfield (struct line const *line, struct keyfield const *key) +limfield_uni (struct line const *line, struct keyfield const *key) { char *ptr = line->text, *lim = ptr + line->length - 1; size_t eword = key->eword, echar = key->echar; -@@ -1666,10 +1874,10 @@ limfield (struct line const *line, struct keyfield const *key) +@@ -1670,10 +1878,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. */ @@ -3284,7 +3380,7 @@ index 5f4c817..bd9c672 100644 ++ptr; if (ptr < lim && (eword || echar)) ++ptr; -@@ -1715,10 +1923,10 @@ limfield (struct line const *line, struct keyfield const *key) +@@ -1719,10 +1927,10 @@ limfield (struct line const *line, struct keyfield const *key) */ /* Make LIM point to the end of (one byte past) the current field. */ @@ -3297,7 +3393,7 @@ index 5f4c817..bd9c672 100644 if (newlim) lim = newlim; } -@@ -1749,6 +1957,130 @@ limfield (struct line const *line, struct keyfield const *key) +@@ -1753,6 +1961,130 @@ limfield (struct line const *line, struct keyfield const *key) return ptr; } @@ -3428,7 +3524,7 @@ index 5f4c817..bd9c672 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 -@@ -1835,8 +2167,22 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file) +@@ -1839,8 +2171,22 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file) else { if (key->skipsblanks) @@ -3453,9 +3549,9 @@ index 5f4c817..bd9c672 100644 line->keybeg = line_start; } } -@@ -1970,12 +2316,10 @@ find_unit_order (char const *number) - < K/k < M < G < T < P < E < Z < Y */ +@@ -1976,12 +2322,10 @@ find_unit_order (char const *number) + ATTRIBUTE_PURE static int -human_numcompare (char const *a, char const *b) +human_numcompare (char *a, char *b) @@ -3469,16 +3565,16 @@ index 5f4c817..bd9c672 100644 int diff = find_unit_order (a) - find_unit_order (b); return (diff ? diff : strnumcmp (a, b, decimal_point, thousands_sep)); -@@ -1986,7 +2330,7 @@ human_numcompare (char const *a, char const *b) - hideously fast. */ +@@ -1993,7 +2337,7 @@ human_numcompare (char const *a, char const *b) + ATTRIBUTE_PURE static int -numcompare (char const *a, char const *b) +numcompare_uni (const char *a, const char *b) { while (blanks[to_uchar (*a)]) a++; -@@ -1996,6 +2340,25 @@ numcompare (char const *a, char const *b) +@@ -2003,6 +2347,25 @@ numcompare (char const *a, char const *b) return strnumcmp (a, b, decimal_point, thousands_sep); } @@ -3504,7 +3600,7 @@ index 5f4c817..bd9c672 100644 /* 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 -@@ -2046,7 +2409,7 @@ general_numcompare (char const *sa, char const *sb) +@@ -2053,7 +2416,7 @@ general_numcompare (char const *sa, char const *sb) Return 0 if the name in S is not recognized. */ static int @@ -3513,7 +3609,7 @@ index 5f4c817..bd9c672 100644 { size_t lo = 0; size_t hi = MONTHS_PER_YEAR; -@@ -2322,15 +2685,14 @@ debug_key (struct line const *line, struct keyfield const *key) +@@ -2329,15 +2692,14 @@ debug_key (struct line const *line, struct keyfield const *key) char saved = *lim; *lim = '\0'; @@ -3531,7 +3627,7 @@ index 5f4c817..bd9c672 100644 else if (key->general_numeric) ignore_value (strtold (beg, &tighter_lim)); else if (key->numeric || key->human_numeric) -@@ -2464,7 +2826,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) +@@ -2483,7 +2845,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 */ @@ -3540,7 +3636,66 @@ index 5f4c817..bd9c672 100644 && ((!key->skipsblanks && !implicit_skip) || (!key->skipsblanks && key->schar) || (!key->skipeblanks && key->echar))) -@@ -2522,11 +2884,87 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) +@@ -2531,9 +2893,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + bool number_locale_warned = false; + if (basic_numeric_field_span) + { +- if (tab == TAB_DEFAULT +- ? thousands_sep != NON_CHAR && (isblank (to_uchar (thousands_sep))) +- : tab == thousands_sep) ++ if (tab_length ++ ? tab[0] == thousands_sep ++ : thousands_sep != NON_CHAR && (isblank (to_uchar (thousands_sep)))) + { + error (0, 0, + _("field separator %s is treated as a " +@@ -2544,9 +2906,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + } + if (basic_numeric_field_span || general_numeric_field_span) + { +- if (tab == TAB_DEFAULT +- ? thousands_sep != NON_CHAR && (isblank (to_uchar (decimal_point))) +- : tab == decimal_point) ++ if (tab_length ++ ? tab[0] == decimal_point ++ : thousands_sep != NON_CHAR && (isblank (to_uchar (decimal_point)))) + { + error (0, 0, + _("field separator %s is treated as a " +@@ -2554,19 +2916,19 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + quote (((char []) {decimal_point, 0}))); + number_locale_warned = true; + } +- else if (tab == '-') ++ else if (tab_length && tab[0] == '-') + { + error (0, 0, + _("field separator %s is treated as a " + "minus sign in numbers"), +- quote (((char []) {tab, 0}))); ++ quote (((char []) {tab[0], 0}))); + } +- else if (general_numeric_field_span && tab == '+') ++ else if (general_numeric_field_span && tab_length && tab[0] == '+') + { + error (0, 0, + _("field separator %s is treated as a " + "plus sign in numbers"), +- quote (((char []) {tab, 0}))); ++ quote (((char []) {tab[0], 0}))); + } + } + +@@ -2577,7 +2939,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + { + error (0, 0, + _("%snumbers use %s as a decimal point in this locale"), +- tab == decimal_point ? "" : _("note "), ++ (tab_length && tab[0] == decimal_point) ? "" : _("note "), + quote (((char []) {decimal_point, 0}))); + + } +@@ -2610,11 +2972,87 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) error (0, 0, _("option '-r' only applies to last-resort comparison")); } @@ -3629,7 +3784,7 @@ index 5f4c817..bd9c672 100644 { struct keyfield *key = keylist; -@@ -2611,7 +3049,7 @@ keycompare (struct line const *a, struct line const *b) +@@ -2699,7 +3137,7 @@ keycompare (struct line const *a, struct line const *b) else if (key->human_numeric) diff = human_numcompare (ta, tb); else if (key->month) @@ -3638,7 +3793,7 @@ index 5f4c817..bd9c672 100644 else if (key->random) diff = compare_random (ta, tlena, tb, tlenb); else if (key->version) -@@ -2727,6 +3165,211 @@ keycompare (struct line const *a, struct line const *b) +@@ -2815,6 +3253,211 @@ keycompare (struct line const *a, struct line const *b) return key->reverse ? -diff : diff; } @@ -3850,7 +4005,7 @@ index 5f4c817..bd9c672 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. */ -@@ -2754,7 +3397,7 @@ compare (struct line const *a, struct line const *b) +@@ -2842,7 +3485,7 @@ compare (struct line const *a, struct line const *b) diff = - NONZERO (blen); else if (blen == 0) diff = 1; @@ -3859,7 +4014,7 @@ index 5f4c817..bd9c672 100644 { /* xmemcoll0 is a performance enhancement as it will not unconditionally write '\0' after the -@@ -4144,6 +4787,7 @@ set_ordering (char const *s, struct keyfield *key, enum blanktype blanktype) +@@ -4226,6 +4869,7 @@ set_ordering (char const *s, struct keyfield *key, enum blanktype blanktype) break; case 'f': key->translate = fold_toupper; @@ -3867,7 +4022,7 @@ index 5f4c817..bd9c672 100644 break; case 'g': key->general_numeric = true; -@@ -4223,7 +4867,7 @@ main (int argc, char **argv) +@@ -4305,7 +4949,7 @@ main (int argc, char **argv) initialize_exit_failure (SORT_FAILURE); hard_LC_COLLATE = hard_locale (LC_COLLATE); @@ -3876,8 +4031,8 @@ index 5f4c817..bd9c672 100644 hard_LC_TIME = hard_locale (LC_TIME); #endif -@@ -4244,6 +4888,29 @@ main (int argc, char **argv) - thousands_sep = -1; +@@ -4328,6 +4972,29 @@ main (int argc, char **argv) + thousands_sep = NON_CHAR; } +#if HAVE_MBRTOWC @@ -3906,7 +4061,7 @@ index 5f4c817..bd9c672 100644 have_read_stdin = false; inittables (); -@@ -4518,13 +5185,34 @@ main (int argc, char **argv) +@@ -4602,13 +5269,34 @@ main (int argc, char **argv) case 't': { @@ -3945,7 +4100,7 @@ index 5f4c817..bd9c672 100644 else { /* Provoke with 'sort -txx'. Complain about -@@ -4535,9 +5223,11 @@ main (int argc, char **argv) +@@ -4619,9 +5307,11 @@ main (int argc, char **argv) quote (optarg)); } } @@ -3959,21 +4114,8 @@ index 5f4c817..bd9c672 100644 } break; -@@ -4766,12 +5456,10 @@ main (int argc, char **argv) - sort (files, nfiles, outfile, nthreads); - } - --#ifdef lint - if (files_from) - readtokens0_free (&tok); - else - free (files); --#endif - - if (have_read_stdin && fclose (stdin) == EOF) - sort_die (_("close failed"), "-"); diff --git a/src/unexpand.c b/src/unexpand.c -index cec392d..483f0ef 100644 +index 7d6100f..04cd646 100644 --- a/src/unexpand.c +++ b/src/unexpand.c @@ -38,6 +38,9 @@ @@ -4178,7 +4320,7 @@ index cec392d..483f0ef 100644 } diff --git a/src/uniq.c b/src/uniq.c -index 8f6e973..752797a 100644 +index e5996f0..871d47c 100644 --- a/src/uniq.c +++ b/src/uniq.c @@ -21,6 +21,17 @@ @@ -4229,16 +4371,16 @@ index 8f6e973..752797a 100644 static struct option const longopts[] = { {"count", no_argument, NULL, 'c'}, -@@ -253,7 +280,7 @@ size_opt (char const *opt, char const *msgid) - return a pointer to the beginning of the line's field to be compared. */ +@@ -254,7 +281,7 @@ size_opt (char const *opt, char const *msgid) - static char * _GL_ATTRIBUTE_PURE + ATTRIBUTE_PURE + static char * -find_field (struct linebuffer const *line) +find_field_uni (struct linebuffer *line) { size_t count; char const *lp = line->buffer; -@@ -273,6 +300,83 @@ find_field (struct linebuffer const *line) +@@ -274,6 +301,83 @@ find_field (struct linebuffer const *line) return line->buffer + i; } @@ -4322,7 +4464,7 @@ index 8f6e973..752797a 100644 /* Return false if two strings OLD and NEW match, true if not. OLD and NEW point not to the beginnings of the lines but rather to the beginnings of the fields to compare. -@@ -493,6 +597,19 @@ main (int argc, char **argv) +@@ -494,6 +598,19 @@ main (int argc, char **argv) atexit (close_stdout); @@ -4343,7 +4485,7 @@ index 8f6e973..752797a 100644 skip_fields = 0; check_chars = SIZE_MAX; diff --git a/tests/Coreutils.pm b/tests/Coreutils.pm -index dc6b132..a2abc6d 100644 +index fad7ab9..c9021a6 100644 --- a/tests/Coreutils.pm +++ b/tests/Coreutils.pm @@ -269,6 +269,9 @@ sub run_tests ($$$$$) @@ -4581,10 +4723,10 @@ index 0000000..26c95de + +Exit $fail diff --git a/tests/local.mk b/tests/local.mk -index 228d0e3..a76c808 100644 +index 0f77786..dbe1843 100644 --- a/tests/local.mk +++ b/tests/local.mk -@@ -375,6 +375,8 @@ all_tests = \ +@@ -377,6 +377,8 @@ all_tests = \ tests/misc/sort-discrim.sh \ tests/misc/sort-files0-from.pl \ tests/misc/sort-float.sh \ @@ -4593,7 +4735,7 @@ index 228d0e3..a76c808 100644 tests/misc/sort-h-thousands-sep.sh \ tests/misc/sort-merge.pl \ tests/misc/sort-merge-fdlimit.sh \ -@@ -573,6 +575,7 @@ all_tests = \ +@@ -576,6 +578,7 @@ all_tests = \ tests/du/threshold.sh \ tests/du/trailing-slash.sh \ tests/du/two-args.sh \ @@ -4601,7 +4743,7 @@ index 228d0e3..a76c808 100644 tests/id/gnu-zero-uids.sh \ tests/id/no-context.sh \ tests/id/context.sh \ -@@ -724,6 +727,7 @@ all_tests = \ +@@ -727,6 +730,7 @@ all_tests = \ tests/touch/read-only.sh \ tests/touch/relative.sh \ tests/touch/trailing-slash.sh \ @@ -4610,7 +4752,7 @@ index 228d0e3..a76c808 100644 # See tests/factor/create-test.sh. diff --git a/tests/misc/expand.pl b/tests/misc/expand.pl -index a10ff19..e1706c1 100755 +index 7a77e6f..27f6652 100755 --- a/tests/misc/expand.pl +++ b/tests/misc/expand.pl @@ -27,6 +27,15 @@ my $prog = 'expand'; @@ -4677,7 +4819,7 @@ index a10ff19..e1706c1 100755 my $verbose = $ENV{VERBOSE}; diff --git a/tests/misc/fold.pl b/tests/misc/fold.pl -index beacec9..b56afca 100755 +index 2834f92..bc1616a 100755 --- a/tests/misc/fold.pl +++ b/tests/misc/fold.pl @@ -20,9 +20,18 @@ use strict; @@ -4750,7 +4892,7 @@ index beacec9..b56afca 100755 my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); exit $fail; diff --git a/tests/misc/join.pl b/tests/misc/join.pl -index bfd9e6f..75788c9 100755 +index 06ad777..be40204 100755 --- a/tests/misc/join.pl +++ b/tests/misc/join.pl @@ -25,6 +25,15 @@ my $limits = getlimits (); @@ -4871,7 +5013,7 @@ index 0000000..11836ba + +Exit $fail diff --git a/tests/misc/sort-merge.pl b/tests/misc/sort-merge.pl -index 70d8af1..6b4840a 100755 +index 7eb4574..eda884c 100755 --- a/tests/misc/sort-merge.pl +++ b/tests/misc/sort-merge.pl @@ -26,6 +26,15 @@ my $prog = 'sort'; @@ -4931,7 +5073,7 @@ index 70d8af1..6b4840a 100755 my $verbose = $ENV{VERBOSE}; diff --git a/tests/misc/sort.pl b/tests/misc/sort.pl -index 86970ff..c016ff7 100755 +index 0b0adca..fd27821 100755 --- a/tests/misc/sort.pl +++ b/tests/misc/sort.pl @@ -24,10 +24,15 @@ my $prog = 'sort'; @@ -4999,7 +5141,7 @@ index 86970ff..c016ff7 100755 my $save_temps = $ENV{DEBUG}; my $verbose = $ENV{VERBOSE}; diff --git a/tests/misc/unexpand.pl b/tests/misc/unexpand.pl -index 1c8e308..9f8ab89 100755 +index 2e1906f..fe66012 100755 --- a/tests/misc/unexpand.pl +++ b/tests/misc/unexpand.pl @@ -27,6 +27,14 @@ my $limits = getlimits (); @@ -5056,7 +5198,7 @@ index 1c8e308..9f8ab89 100755 my $verbose = $ENV{VERBOSE}; diff --git a/tests/misc/uniq.pl b/tests/misc/uniq.pl -index 74d3815..aae4c7e 100755 +index aa163cd..91d617d 100755 --- a/tests/misc/uniq.pl +++ b/tests/misc/uniq.pl @@ -23,9 +23,17 @@ my $limits = getlimits (); @@ -5132,7 +5274,7 @@ index 74d3815..aae4c7e 100755 @Tests = triple_test \@Tests; diff --git a/tests/pr/pr-tests.pl b/tests/pr/pr-tests.pl -index d0ac405..ff7d472 100755 +index 7ac6d4c..ae6cc35 100755 --- a/tests/pr/pr-tests.pl +++ b/tests/pr/pr-tests.pl @@ -24,6 +24,15 @@ use strict; @@ -5379,5 +5521,5 @@ index 0000000..8a82d74 +LC_ALL=C unexpand in in > out || fail=1 +compare exp out > /dev/null 2>&1 || fail=1 -- -2.31.1 +2.34.1 diff --git a/backport-dd-do-not-access-uninitialized.patch b/backport-dd-do-not-access-uninitialized.patch deleted file mode 100644 index b4860ba532ec44d4bf1a32170cfef3e5d5335b26..0000000000000000000000000000000000000000 --- a/backport-dd-do-not-access-uninitialized.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 604f8a6c4d58a646c8722fdf7cad9ee67479d8f7 Mon Sep 17 00:00:00 2001 -From: Paul Eggert -Date: Mon, 31 Jan 2022 10:20:21 -0800 -Subject: [PATCH] dd: do not access uninitialized -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -* src/dd.c (parse_integer): Avoid undefined behavior -that accesses an uninitialized ‘n’ when e == LONGINT_INVALID. -Return more-accurate error code when INTMAX_MAX < n. ---- - src/dd.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/src/dd.c b/src/dd.c -index e55f87f149..7360a49738 100644 ---- a/src/dd.c -+++ b/src/dd.c -@@ -1427,8 +1427,10 @@ static intmax_t - parse_integer (char const *str, strtol_error *invalid) - { - /* Call xstrtoumax, not xstrtoimax, since we don't want to -- allow strings like " -0". */ -- uintmax_t n; -+ allow strings like " -0". Initialize N to an interminate value; -+ calling code should not rely on this function returning 0 -+ when *INVALID represents a non-overflow error. */ -+ uintmax_t n = 0; - char *suffix; - strtol_error e = xstrtoumax (str, &suffix, 10, &n, "bcEGkKMPTwYZ0"); - -@@ -1468,7 +1470,7 @@ parse_integer (char const *str, strtol_error *invalid) - - if (INTMAX_MAX < n) - { -- *invalid = LONGINT_OVERFLOW; -+ *invalid = e | LONGINT_OVERFLOW; - return INTMAX_MAX; - } - diff --git a/backport-dd-improve-integer-overflow-checking.patch b/backport-dd-improve-integer-overflow-checking.patch deleted file mode 100644 index 3fc5f014fbf0d4de1596b331fd3f6ee86325fe70..0000000000000000000000000000000000000000 --- a/backport-dd-improve-integer-overflow-checking.patch +++ /dev/null @@ -1,833 +0,0 @@ -From e94d95075dd919e5e6ec0c8ed09477e58b863788 Mon Sep 17 00:00:00 2001 -From: Paul Eggert -Date: Tue, 18 Jan 2022 13:22:02 -0800 -Subject: [PATCH] dd: improve integer overflow checking -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -* src/dd.c: Prefer signed to unsigned types where either will do, -as this helps improve checking with gcc -fsanitize=undefined. -Limit the signed types to their intended ranges. -(MAX_BLOCKSIZE): Don’t exceed IDX_MAX - slop either. -(input_offset_overflow): Remove; overflow now denoted by negative. -(parse_integer): Return INTMAX_MAX on overflow, instead of unspecified. -Do not falsely report overflow for ‘00x99999999999999999999999999999’. -* tests/dd/misc.sh: New test for 00xBIG. -* tests/dd/skip-seek-past-file.sh: Adjust to new diagnostic wording. -New test for BIGxBIG. ---- - src/dd.c | 298 +++++++++++++++++--------------- - tests/dd/misc.sh | 9 +- - tests/dd/skip-seek-past-file.sh | 9 +- - 3 files changed, 177 insertions(+), 139 deletions(-) - -diff --git a/src/dd.c b/src/dd.c -index 35002f4d2e..bde92e97a4 100644 ---- a/src/dd.c -+++ b/src/dd.c -@@ -98,11 +98,12 @@ - #define OUTPUT_BLOCK_SLOP (page_size - 1) - - /* Maximum blocksize for the given SLOP. -- Keep it smaller than SIZE_MAX - SLOP, so that we can -+ Keep it smaller than MIN (IDX_MAX, SIZE_MAX) - SLOP, so that we can - allocate buffers that size. Keep it smaller than SSIZE_MAX, for - the benefit of system calls like "read". And keep it smaller than - OFF_T_MAX, for the benefit of the large-offset seek code. */ --#define MAX_BLOCKSIZE(slop) MIN (SIZE_MAX - (slop), MIN (SSIZE_MAX, OFF_T_MAX)) -+#define MAX_BLOCKSIZE(slop) MIN (MIN (IDX_MAX, SIZE_MAX) - (slop), \ -+ MIN (SSIZE_MAX, OFF_T_MAX)) - - /* Conversions bit masks. */ - enum -@@ -148,39 +149,39 @@ static char const *input_file = NULL; - static char const *output_file = NULL; - - /* The page size on this host. */ --static size_t page_size; -+static idx_t page_size; - - /* The number of bytes in which atomic reads are done. */ --static size_t input_blocksize = 0; -+static idx_t input_blocksize = 0; - - /* The number of bytes in which atomic writes are done. */ --static size_t output_blocksize = 0; -+static idx_t output_blocksize = 0; - - /* Conversion buffer size, in bytes. 0 prevents conversions. */ --static size_t conversion_blocksize = 0; -+static idx_t conversion_blocksize = 0; - - /* Skip this many records of 'input_blocksize' bytes before input. */ --static uintmax_t skip_records = 0; -+static intmax_t skip_records = 0; - - /* Skip this many bytes before input in addition of 'skip_records' - records. */ --static size_t skip_bytes = 0; -+static idx_t skip_bytes = 0; - - /* Skip this many records of 'output_blocksize' bytes before output. */ --static uintmax_t seek_records = 0; -+static intmax_t seek_records = 0; - - /* Skip this many bytes in addition to 'seek_records' records before - output. */ --static uintmax_t seek_bytes = 0; -+static intmax_t seek_bytes = 0; - - /* Whether the final output was done with a seek (rather than a write). */ - static bool final_op_was_seek; - - /* Copy only this many records. The default is effectively infinity. */ --static uintmax_t max_records = (uintmax_t) -1; -+static intmax_t max_records = INTMAX_MAX; - - /* Copy this many bytes in addition to 'max_records' records. */ --static size_t max_bytes = 0; -+static idx_t max_bytes = 0; - - /* Bit vector of conversions to apply. */ - static int conversions_mask = 0; -@@ -196,19 +197,19 @@ static int status_level = STATUS_DEFAULT; - static bool translation_needed = false; - - /* Number of partial blocks written. */ --static uintmax_t w_partial = 0; -+static intmax_t w_partial = 0; - - /* Number of full blocks written. */ --static uintmax_t w_full = 0; -+static intmax_t w_full = 0; - - /* Number of partial blocks read. */ --static uintmax_t r_partial = 0; -+static intmax_t r_partial = 0; - - /* Number of full blocks read. */ --static uintmax_t r_full = 0; -+static intmax_t r_full = 0; - - /* Number of bytes written. */ --static uintmax_t w_bytes = 0; -+static intmax_t w_bytes = 0; - - /* Time that dd started. */ - static xtime_t start_time; -@@ -226,16 +227,14 @@ static bool input_seekable; - If ESPIPE, do not issue any more diagnostics about it. */ - static int input_seek_errno; - --/* File offset of the input, in bytes, along with a flag recording -- whether it overflowed. */ --static uintmax_t input_offset; --static bool input_offset_overflow; -+/* File offset of the input, in bytes, or -1 if it overflowed. */ -+static off_t input_offset; - - /* True if a partial read should be diagnosed. */ - static bool warn_partial_read; - - /* Records truncated by conv=block. */ --static uintmax_t r_truncate = 0; -+static intmax_t r_truncate = 0; - - /* Output representation of newline and space characters. - They change if we're converting to EBCDIC. */ -@@ -253,10 +252,10 @@ static char *ibuf; - static char *obuf; - - /* Current index into 'obuf'. */ --static size_t oc = 0; -+static idx_t oc = 0; - - /* Index into current line, for 'conv=block' and 'conv=unblock'. */ --static size_t col = 0; -+static idx_t col = 0; - - /* The set of signals that are caught. */ - static sigset_t caught_signals; -@@ -274,7 +273,7 @@ static bool i_nocache, o_nocache; - static bool i_nocache_eof, o_nocache_eof; - - /* Function used for read (to handle iflag=fullblock parameter). */ --static ssize_t (*iread_fnc) (int fd, char *buf, size_t size); -+static ssize_t (*iread_fnc) (int fd, char *buf, idx_t size); - - /* A longest symbol in the struct symbol_values tables below. */ - #define LONGEST_SYMBOL "count_bytes" -@@ -701,11 +700,10 @@ alloc_ibuf (void) - char *buf = malloc (input_blocksize + INPUT_BLOCK_SLOP); - if (!buf) - { -- uintmax_t ibs = input_blocksize; - char hbuf[LONGEST_HUMAN_READABLE + 1]; - die (EXIT_FAILURE, 0, -- _("memory exhausted by input buffer of size %"PRIuMAX" bytes (%s)"), -- ibs, -+ _("memory exhausted by input buffer of size %td bytes (%s)"), -+ input_blocksize, - human_readable (input_blocksize, hbuf, - human_opts | human_base_1024, 1, 1)); - } -@@ -729,12 +727,11 @@ alloc_obuf (void) - char *buf = malloc (output_blocksize + OUTPUT_BLOCK_SLOP); - if (!buf) - { -- uintmax_t obs = output_blocksize; - char hbuf[LONGEST_HUMAN_READABLE + 1]; - die (EXIT_FAILURE, 0, -- _("memory exhausted by output buffer of size %"PRIuMAX -+ _("memory exhausted by output buffer of size %td" - " bytes (%s)"), -- obs, -+ output_blocksize, - human_readable (output_blocksize, hbuf, - human_opts | human_base_1024, 1, 1)); - } -@@ -793,8 +790,7 @@ print_xfer_stats (xtime_t progress_time) - if (start_time < now) - { - double XTIME_PRECISIONe0 = XTIME_PRECISION; -- uintmax_t delta_xtime = now; -- delta_xtime -= start_time; -+ xtime_t delta_xtime = now - start_time; - delta_s = delta_xtime / XTIME_PRECISIONe0; - bytes_per_second = human_readable (w_bytes, bpsbuf, human_opts, - XTIME_PRECISION, delta_xtime); -@@ -822,16 +818,16 @@ print_xfer_stats (xtime_t progress_time) - int stats_len - = (abbreviation_lacks_prefix (si) - ? fprintf (stderr, -- ngettext ("%"PRIuMAX" byte copied, %s, %s", -- "%"PRIuMAX" bytes copied, %s, %s", -+ ngettext ("%"PRIdMAX" byte copied, %s, %s", -+ "%"PRIdMAX" bytes copied, %s, %s", - select_plural (w_bytes)), - w_bytes, delta_s_buf, bytes_per_second) - : abbreviation_lacks_prefix (iec) - ? fprintf (stderr, -- _("%"PRIuMAX" bytes (%s) copied, %s, %s"), -+ _("%"PRIdMAX" bytes (%s) copied, %s, %s"), - w_bytes, si, delta_s_buf, bytes_per_second) - : fprintf (stderr, -- _("%"PRIuMAX" bytes (%s, %s) copied, %s, %s"), -+ _("%"PRIdMAX" bytes (%s, %s) copied, %s, %s"), - w_bytes, si, iec, delta_s_buf, bytes_per_second)); - - if (progress_time) -@@ -863,14 +859,14 @@ print_stats (void) - } - - fprintf (stderr, -- _("%"PRIuMAX"+%"PRIuMAX" records in\n" -- "%"PRIuMAX"+%"PRIuMAX" records out\n"), -+ _("%"PRIdMAX"+%"PRIdMAX" records in\n" -+ "%"PRIdMAX"+%"PRIdMAX" records out\n"), - r_full, r_partial, w_full, w_partial); - - if (r_truncate != 0) - fprintf (stderr, -- ngettext ("%"PRIuMAX" truncated record\n", -- "%"PRIuMAX" truncated records\n", -+ ngettext ("%"PRIdMAX" truncated record\n", -+ "%"PRIdMAX" truncated records\n", - select_plural (r_truncate)), - r_truncate); - -@@ -1050,7 +1046,9 @@ cache_round (int fd, off_t len) - - if (len) - { -- uintmax_t c_pending = *pending + len; -+ intmax_t c_pending; -+ if (INT_ADD_WRAPV (*pending, len, &c_pending)) -+ c_pending = INTMAX_MAX; - *pending = c_pending % IO_BUFSIZE; - if (c_pending > *pending) - len = c_pending - *pending; -@@ -1138,7 +1136,7 @@ invalidate_cache (int fd, off_t len) - bytes read if successful, -1 (setting errno) on failure. */ - - static ssize_t --iread (int fd, char *buf, size_t size) -+iread (int fd, char *buf, idx_t size) - { - ssize_t nread; - static ssize_t prev_nread; -@@ -1167,11 +1165,11 @@ iread (int fd, char *buf, size_t size) - { - if (0 < prev_nread && prev_nread < size) - { -- uintmax_t prev = prev_nread; -+ idx_t prev = prev_nread; - if (status_level != STATUS_NONE) -- error (0, 0, ngettext (("warning: partial read (%"PRIuMAX" byte); " -+ error (0, 0, ngettext (("warning: partial read (%td byte); " - "suggest iflag=fullblock"), -- ("warning: partial read (%"PRIuMAX" bytes); " -+ ("warning: partial read (%td bytes); " - "suggest iflag=fullblock"), - select_plural (prev)), - prev); -@@ -1185,7 +1183,7 @@ iread (int fd, char *buf, size_t size) - - /* Wrapper around iread function to accumulate full blocks. */ - static ssize_t --iread_fullblock (int fd, char *buf, size_t size) -+iread_fullblock (int fd, char *buf, idx_t size) - { - ssize_t nread = 0; - -@@ -1209,10 +1207,10 @@ iread_fullblock (int fd, char *buf, size_t size) - this is less than SIZE. Keep trying if there are partial - writes. */ - --static size_t --iwrite (int fd, char const *buf, size_t size) -+static idx_t -+iwrite (int fd, char const *buf, idx_t size) - { -- size_t total_written = 0; -+ idx_t total_written = 0; - - if ((output_flags & O_DIRECT) && size < output_blocksize) - { -@@ -1290,7 +1288,7 @@ iwrite (int fd, char const *buf, size_t size) - static void - write_output (void) - { -- size_t nwritten = iwrite (STDOUT_FILENO, obuf, output_blocksize); -+ idx_t nwritten = iwrite (STDOUT_FILENO, obuf, output_blocksize); - w_bytes += nwritten; - if (nwritten != output_blocksize) - { -@@ -1422,7 +1420,7 @@ parse_symbols (char const *str, struct symbol_value const *table, - { - if (! entry->symbol[0]) - { -- size_t slen = strcomma ? strcomma - str : strlen (str); -+ idx_t slen = strcomma ? strcomma - str : strlen (str); - error (0, 0, "%s: %s", _(error_msgid), - quotearg_n_style_mem (0, locale_quoting_style, str, slen)); - usage (EXIT_FAILURE); -@@ -1443,40 +1441,61 @@ parse_symbols (char const *str, struct symbol_value const *table, - - /* Return the value of STR, interpreted as a non-negative decimal integer, - optionally multiplied by various values. -- Set *INVALID to a nonzero error value if STR does not represent a -- number in this format. */ -+ If STR does not represent a number in this format, -+ set *INVALID to a nonzero error value and return -+ INTMAX_MAX if it is an overflow, an indeterminate value otherwise. */ - --static uintmax_t -+static intmax_t - parse_integer (char const *str, strtol_error *invalid) - { -+ /* Call xstrtoumax, not xstrtoimax, since we don't want to -+ allow strings like " -0". */ - uintmax_t n; - char *suffix; - strtol_error e = xstrtoumax (str, &suffix, 10, &n, "bcEGkKMPTwYZ0"); - -- if (e == LONGINT_INVALID_SUFFIX_CHAR && *suffix == 'x') -+ if ((e & ~LONGINT_OVERFLOW) == LONGINT_INVALID_SUFFIX_CHAR -+ && *suffix == 'x') - { -- uintmax_t multiplier = parse_integer (suffix + 1, invalid); -+ strtol_error invalid2 = LONGINT_OK; -+ intmax_t result = parse_integer (suffix + 1, &invalid2); -+ if ((invalid2 & ~LONGINT_OVERFLOW) != LONGINT_OK) -+ { -+ *invalid = invalid2; -+ return result; -+ } - -- if (multiplier != 0 && n * multiplier / multiplier != n) -+ if (INT_MULTIPLY_WRAPV (n, result, &result)) - { - *invalid = LONGINT_OVERFLOW; -- return 0; -+ return INTMAX_MAX; - } - -- if (n == 0 && STRPREFIX (str, "0x")) -- error (0, 0, -- _("warning: %s is a zero multiplier; " -- "use %s if that is intended"), -- quote_n (0, "0x"), quote_n (1, "00x")); -+ if (result == 0) -+ { -+ if (STRPREFIX (str, "0x")) -+ error (0, 0, -+ _("warning: %s is a zero multiplier; " -+ "use %s if that is intended"), -+ quote_n (0, "0x"), quote_n (1, "00x")); -+ } -+ else if ((e | invalid2) & LONGINT_OVERFLOW) -+ { -+ *invalid = LONGINT_OVERFLOW; -+ return INTMAX_MAX; -+ } - -- n *= multiplier; -+ return result; - } -- else if (e != LONGINT_OK) -+ -+ if (INTMAX_MAX < n) - { -- *invalid = e; -- return 0; -+ *invalid = LONGINT_OVERFLOW; -+ return INTMAX_MAX; - } - -+ if (e != LONGINT_OK) -+ *invalid = e; - return n; - } - -@@ -1492,10 +1511,10 @@ operand_is (char const *operand, char const *name) - static void - scanargs (int argc, char *const *argv) - { -- size_t blocksize = 0; -- uintmax_t count = (uintmax_t) -1; -- uintmax_t skip = 0; -- uintmax_t seek = 0; -+ idx_t blocksize = 0; -+ intmax_t count = INTMAX_MAX; -+ intmax_t skip = 0; -+ intmax_t seek = 0; - - for (int i = optind; i < argc; i++) - { -@@ -1529,33 +1548,34 @@ scanargs (int argc, char *const *argv) - else - { - strtol_error invalid = LONGINT_OK; -- uintmax_t n = parse_integer (val, &invalid); -- uintmax_t n_min = 0; -- uintmax_t n_max = UINTMAX_MAX; -+ intmax_t n = parse_integer (val, &invalid); -+ intmax_t n_min = 0; -+ intmax_t n_max = INTMAX_MAX; -+ idx_t *converted_idx = NULL; - - if (operand_is (name, "ibs")) - { - n_min = 1; - n_max = MAX_BLOCKSIZE (INPUT_BLOCK_SLOP); -- input_blocksize = n; -+ converted_idx = &input_blocksize; - } - else if (operand_is (name, "obs")) - { - n_min = 1; - n_max = MAX_BLOCKSIZE (OUTPUT_BLOCK_SLOP); -- output_blocksize = n; -+ converted_idx = &output_blocksize; - } - else if (operand_is (name, "bs")) - { - n_min = 1; - n_max = MAX_BLOCKSIZE (INPUT_BLOCK_SLOP); -- blocksize = n; -+ converted_idx = &blocksize; - } - else if (operand_is (name, "cbs")) - { - n_min = 1; -- n_max = SIZE_MAX; -- conversion_blocksize = n; -+ n_max = MIN (SIZE_MAX, IDX_MAX); -+ converted_idx = &conversion_blocksize; - } - else if (operand_is (name, "skip")) - skip = n; -@@ -1578,6 +1598,8 @@ scanargs (int argc, char *const *argv) - if (invalid != LONGINT_OK) - die (EXIT_FAILURE, invalid == LONGINT_OVERFLOW ? EOVERFLOW : 0, - "%s: %s", _("invalid number"), quote (val)); -+ else if (converted_idx) -+ *converted_idx = n; - } - } - -@@ -1628,12 +1650,12 @@ scanargs (int argc, char *const *argv) - else if (skip != 0) - skip_records = skip; - -- if (input_flags & O_COUNT_BYTES && count != (uintmax_t) -1) -+ if (input_flags & O_COUNT_BYTES && count != INTMAX_MAX) - { - max_records = count / input_blocksize; - max_bytes = count % input_blocksize; - } -- else if (count != (uintmax_t) -1) -+ else if (count != INTMAX_MAX) - max_records = count; - - if (output_flags & O_SEEK_BYTES && seek != 0) -@@ -1651,7 +1673,7 @@ scanargs (int argc, char *const *argv) - warn_partial_read = - (! (conversions_mask & C_TWOBUFS) && ! (input_flags & O_FULLBLOCK) - && (skip_records -- || (0 < max_records && max_records < (uintmax_t) -1) -+ || (0 < max_records && max_records < INTMAX_MAX) - || (input_flags | output_flags) & O_DIRECT)); - - iread_fnc = ((input_flags & O_FULLBLOCK) -@@ -1726,9 +1748,9 @@ apply_translations (void) - to the NREAD bytes in BUF. */ - - static void --translate_buffer (char *buf, size_t nread) -+translate_buffer (char *buf, idx_t nread) - { -- size_t i; -+ idx_t i; - char *cp; - for (i = nread, cp = buf; i; i--, cp++) - *cp = trans_table[to_uchar (*cp)]; -@@ -1746,7 +1768,7 @@ static char saved_char; - next call. Return the new start of the BUF buffer. */ - - static char * --swab_buffer (char *buf, size_t *nread) -+swab_buffer (char *buf, idx_t *nread) - { - char *bufstart = buf; - -@@ -1770,7 +1792,7 @@ swab_buffer (char *buf, size_t *nread) - toward the beginning. This way we only move half of the data. */ - - char *cp = bufstart + *nread; /* Start one char past the last. */ -- for (size_t i = *nread / 2; i; i--, cp -= 2) -+ for (idx_t i = *nread >> 1; i; i--, cp -= 2) - *cp = *(cp - 2); - - return ++bufstart; -@@ -1780,11 +1802,10 @@ swab_buffer (char *buf, size_t *nread) - necessary. */ - - static void --advance_input_offset (uintmax_t offset) -+advance_input_offset (intmax_t offset) - { -- input_offset += offset; -- if (input_offset < offset) -- input_offset_overflow = true; -+ if (0 <= input_offset && INT_ADD_WRAPV (input_offset, offset, &input_offset)) -+ input_offset = -1; - } - - /* Throw away RECORDS blocks of BLOCKSIZE bytes plus BYTES bytes on -@@ -1796,18 +1817,18 @@ advance_input_offset (uintmax_t offset) - reached. If FDESC is STDOUT_FILENO, on return, BYTES is the - remaining bytes in addition to the remaining records. */ - --static uintmax_t --skip (int fdesc, char const *file, uintmax_t records, size_t blocksize, -- size_t *bytes) -+static intmax_t -+skip (int fdesc, char const *file, intmax_t records, idx_t blocksize, -+ idx_t *bytes) - { -- uintmax_t offset = records * blocksize + *bytes; -- - /* Try lseek and if an error indicates it was an inappropriate operation -- - or if the file offset is not representable as an off_t -- - fall back on using read. */ - - errno = 0; -- if (records <= OFF_T_MAX / blocksize -+ off_t offset; -+ if (! INT_MULTIPLY_WRAPV (records, blocksize, &offset) -+ && ! INT_ADD_WRAPV (offset, *bytes, &offset) - && 0 <= lseek (fdesc, offset, SEEK_CUR)) - { - if (fdesc == STDIN_FILENO) -@@ -1815,7 +1836,8 @@ skip (int fdesc, char const *file, uintmax_t records, size_t blocksize, - struct stat st; - if (ifstat (STDIN_FILENO, &st) != 0) - die (EXIT_FAILURE, errno, _("cannot fstat %s"), quoteaf (file)); -- if (usable_st_size (&st) && st.st_size < input_offset + offset) -+ if (usable_st_size (&st) && 0 <= input_offset -+ && st.st_size - input_offset < offset) - { - /* When skipping past EOF, return the number of _full_ blocks - * that are not skipped, and set offset to EOF, so the caller -@@ -1920,7 +1942,7 @@ skip (int fdesc, char const *file, uintmax_t records, size_t blocksize, - be seekable. */ - - static bool --advance_input_after_read_error (size_t nbytes) -+advance_input_after_read_error (idx_t nbytes) - { - if (! input_seekable) - { -@@ -1932,8 +1954,7 @@ advance_input_after_read_error (size_t nbytes) - { - off_t offset; - advance_input_offset (nbytes); -- input_offset_overflow |= (OFF_T_MAX < input_offset); -- if (input_offset_overflow) -+ if (input_offset < 0) - { - error (0, 0, _("offset overflow while reading file %s"), - quoteaf (input_file)); -@@ -1962,13 +1983,13 @@ advance_input_after_read_error (size_t nbytes) - /* Copy NREAD bytes of BUF, with no conversions. */ - - static void --copy_simple (char const *buf, size_t nread) -+copy_simple (char const *buf, idx_t nread) - { - char const *start = buf; /* First uncopied char in BUF. */ - - do - { -- size_t nfree = MIN (nread, output_blocksize - oc); -+ idx_t nfree = MIN (nread, output_blocksize - oc); - - memcpy (obuf + oc, start, nfree); - -@@ -1986,15 +2007,15 @@ copy_simple (char const *buf, size_t nread) - replacing the newline with trailing spaces). */ - - static void --copy_with_block (char const *buf, size_t nread) -+copy_with_block (char const *buf, idx_t nread) - { -- for (size_t i = nread; i; i--, buf++) -+ for (idx_t i = nread; i; i--, buf++) - { - if (*buf == newline_character) - { - if (col < conversion_blocksize) - { -- size_t j; -+ idx_t j; - for (j = col; j < conversion_blocksize; j++) - output_char (space_character); - } -@@ -2016,11 +2037,11 @@ copy_with_block (char const *buf, size_t nread) - with a newline). */ - - static void --copy_with_unblock (char const *buf, size_t nread) -+copy_with_unblock (char const *buf, idx_t nread) - { -- static size_t pending_spaces = 0; -+ static idx_t pending_spaces = 0; - -- for (size_t i = 0; i < nread; i++) -+ for (idx_t i = 0; i < nread; i++) - { - char c = buf[i]; - -@@ -2104,10 +2125,10 @@ dd_copy (void) - - /* If nonzero, then the previously read block was partial and - PARTREAD was its size. */ -- size_t partread = 0; -+ idx_t partread = 0; - - int exit_status = EXIT_SUCCESS; -- size_t n_bytes_read; -+ idx_t n_bytes_read; - - /* Leave at least one extra byte at the beginning and end of 'ibuf' - for conv=swab, but keep the buffer address even. But some peculiar -@@ -2128,11 +2149,13 @@ dd_copy (void) - - if (skip_records != 0 || skip_bytes != 0) - { -- uintmax_t us_bytes = input_offset + (skip_records * input_blocksize) -- + skip_bytes; -- uintmax_t us_blocks = skip (STDIN_FILENO, input_file, -- skip_records, input_blocksize, &skip_bytes); -- us_bytes -= input_offset; -+ intmax_t us_bytes; -+ bool us_bytes_overflow = -+ (INT_MULTIPLY_WRAPV (skip_records, input_blocksize, &us_bytes) -+ || INT_ADD_WRAPV (skip_bytes, us_bytes, &us_bytes)); -+ off_t input_offset0 = input_offset; -+ intmax_t us_blocks = skip (STDIN_FILENO, input_file, -+ skip_records, input_blocksize, &skip_bytes); - - /* POSIX doesn't say what to do when dd detects it has been - asked to skip past EOF, so I assume it's non-fatal. -@@ -2140,7 +2163,10 @@ dd_copy (void) - 1. file is too small - 2. pipe has not enough data - 3. partial reads */ -- if ((us_blocks || (!input_offset_overflow && us_bytes)) -+ if ((us_blocks -+ || (0 <= input_offset -+ && (us_bytes_overflow -+ || us_bytes != input_offset - input_offset0))) - && status_level != STATUS_NONE) - { - error (0, 0, -@@ -2150,8 +2176,8 @@ dd_copy (void) - - if (seek_records != 0 || seek_bytes != 0) - { -- size_t bytes = seek_bytes; -- uintmax_t write_records = skip (STDOUT_FILENO, output_file, -+ idx_t bytes = seek_bytes; -+ intmax_t write_records = skip (STDOUT_FILENO, output_file, - seek_records, output_blocksize, &bytes); - - if (write_records != 0 || bytes != 0) -@@ -2160,7 +2186,7 @@ dd_copy (void) - - do - { -- size_t size = write_records ? output_blocksize : bytes; -+ idx_t size = write_records ? output_blocksize : bytes; - if (iwrite (STDOUT_FILENO, obuf, size) != size) - { - error (0, errno, _("writing to %s"), quoteaf (output_file)); -@@ -2230,7 +2256,7 @@ dd_copy (void) - if (conversions_mask & C_NOERROR) - { - print_stats (); -- size_t bad_portion = input_blocksize - partread; -+ idx_t bad_portion = input_blocksize - partread; - - /* We already know this data is not cached, - but call this so that correct offsets are maintained. */ -@@ -2284,7 +2310,7 @@ dd_copy (void) - - if (ibuf == obuf) /* If not C_TWOBUFS. */ - { -- size_t nwritten = iwrite (STDOUT_FILENO, obuf, n_bytes_read); -+ idx_t nwritten = iwrite (STDOUT_FILENO, obuf, n_bytes_read); - w_bytes += nwritten; - if (nwritten != n_bytes_read) - { -@@ -2331,7 +2357,7 @@ dd_copy (void) - { - /* If the final input line didn't end with a '\n', pad - the output block to 'conversion_blocksize' chars. */ -- for (size_t i = col; i < conversion_blocksize; i++) -+ for (idx_t i = col; i < conversion_blocksize; i++) - output_char (space_character); - } - -@@ -2344,7 +2370,7 @@ dd_copy (void) - /* Write out the last block. */ - if (oc != 0) - { -- size_t nwritten = iwrite (STDOUT_FILENO, obuf, oc); -+ idx_t nwritten = iwrite (STDOUT_FILENO, obuf, oc); - w_bytes += nwritten; - if (nwritten != 0) - w_partial++; -@@ -2477,15 +2503,14 @@ main (int argc, char **argv) - - if (seek_records != 0 && !(conversions_mask & C_NOTRUNC)) - { -- uintmax_t size = seek_records * output_blocksize + seek_bytes; -- unsigned long int obs = output_blocksize; -- -- if (OFF_T_MAX / output_blocksize < seek_records) -+ off_t size; -+ if (INT_MULTIPLY_WRAPV (seek_records, output_blocksize, &size) -+ || INT_ADD_WRAPV (seek_bytes, size, &size)) - die (EXIT_FAILURE, 0, - _("offset too large: " -- "cannot truncate to a length of seek=%"PRIuMAX"" -- " (%lu-byte) blocks"), -- seek_records, obs); -+ "cannot truncate to a length of seek=%"PRIdMAX"" -+ " (%td-byte) blocks"), -+ seek_records, output_blocksize); - - if (iftruncate (STDOUT_FILENO, size) != 0) - { -@@ -2502,10 +2527,13 @@ main (int argc, char **argv) - if (S_ISREG (stdout_stat.st_mode) - || S_ISDIR (stdout_stat.st_mode) - || S_TYPEISSHM (&stdout_stat)) -- die (EXIT_FAILURE, ftruncate_errno, -- _("failed to truncate to %"PRIuMAX" bytes" -- " in output file %s"), -- size, quoteaf (output_file)); -+ { -+ intmax_t isize = size; -+ die (EXIT_FAILURE, ftruncate_errno, -+ _("failed to truncate to %"PRIdMAX" bytes" -+ " in output file %s"), -+ isize, quoteaf (output_file)); -+ } - } - } - } -diff --git a/tests/dd/misc.sh b/tests/dd/misc.sh -index 6ca54faac3..d20cbacc87 100755 ---- a/tests/dd/misc.sh -+++ b/tests/dd/misc.sh -@@ -19,6 +19,7 @@ - - . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src - print_ver_ dd -+export LC_ALL=C - - tmp_in=dd-in - tmp_in2=dd-in2 -@@ -98,7 +99,7 @@ test "$outbytes" -eq 3 || fail=1 - # A delay is required to trigger a failure. - # There might be some missed failures but it's unlikely. - (echo a; sleep .1; echo b) \ -- | env LC_ALL=C dd bs=4 status=noxfer iflag=fullblock >out 2>err || fail=1 -+ | dd bs=4 status=noxfer iflag=fullblock >out 2>err || fail=1 - printf 'a\nb\n' > out_ok || framework_failure_ - echo "1+0 records in - 1+0 records out" > err_ok || framework_failure_ -@@ -116,5 +117,11 @@ dd: warning: '0x' is a zero multiplier; use '00x' if that is intended - EOF - compare exp err || fail=1 - -+echo "0+0 records in -+0+0 records out" >err_ok || framework_failure_ -+big=9999999999999999999999999999999999999999999999999999999999999 -+dd if=$tmp_in of=$tmp_out count=00x$big status=noxfer 2>err || fail=1 -+compare /dev/null $tmp_out || fail=1 -+compare err_ok err || fail=1 - - Exit $fail -diff --git a/tests/dd/skip-seek-past-file.sh b/tests/dd/skip-seek-past-file.sh -index 7c2baa2e1a..e952448e2b 100755 ---- a/tests/dd/skip-seek-past-file.sh -+++ b/tests/dd/skip-seek-past-file.sh -@@ -20,7 +20,7 @@ - print_ver_ dd - require_sparse_support_ # for 'truncate --size=$OFF_T_MAX' - eval $(getlimits) # for OFF_T limits -- -+export LC_ALL=C - - printf "1234" > file || framework_failure_ - -@@ -65,8 +65,11 @@ compare err_ok err || fail=1 - - # skipping > OFF_T_MAX should fail immediately - dd bs=1 skip=$OFF_T_OFLOW count=0 status=noxfer < file 2> err && fail=1 --# error message should be "... cannot skip: strerror(EOVERFLOW)" --grep "cannot skip:" err >/dev/null || fail=1 -+# error message should be "... invalid number: strerror(EOVERFLOW)" -+grep "invalid number:" err >/dev/null || fail=1 -+dd bs=1 skip=${OFF_T_OFLOW}x$OFF_T_OFLOW count=0 status=noxfer < file 2> err && -+ fail=1 -+grep "invalid number:" err >/dev/null || fail=1 - - # skipping > max file size should fail immediately - if ! truncate --size=$OFF_T_MAX in 2>/dev/null; then diff --git a/backport-df-fix-memory-leak.patch b/backport-df-fix-memory-leak.patch deleted file mode 100644 index 83a43b67724e25b021507759a6c5d5f3c23c7736..0000000000000000000000000000000000000000 --- a/backport-df-fix-memory-leak.patch +++ /dev/null @@ -1,51 +0,0 @@ -From fb7579768d688a300c4ac76451e1fc7cad59e3e8 Mon Sep 17 00:00:00 2001 -From: Paul Eggert -Date: Mon, 31 Jan 2022 19:52:43 -0800 -Subject: [PATCH] df: fix memory leak - -* src/df.c (devlist_free): Remove. -(filter_mount_list): Free all of devlist, instead of merely -the entries in devlist_table. ---- - src/df.c | 14 ++++---------- - 1 file changed, 4 insertions(+), 10 deletions(-) - -diff --git a/src/df.c b/src/df.c -index 7d32078071..4b2cfb77a6 100644 ---- a/src/df.c -+++ b/src/df.c -@@ -710,12 +710,6 @@ devlist_for_dev (dev_t dev) - return found->seen_last; - } - --static void --devlist_free (void *p) --{ -- free (p); --} -- - /* Filter mount list by skipping duplicate entries. - In the case of duplicates - based on the device number - the mount entry - with a '/' in its me_devname (i.e., not pseudo name like tmpfs) wins. -@@ -736,9 +730,7 @@ filter_mount_list (bool devices_only) - mount_list_size++; - - devlist_table = hash_initialize (mount_list_size, NULL, -- devlist_hash, -- devlist_compare, -- devlist_free); -+ devlist_hash, devlist_compare, NULL); - if (devlist_table == NULL) - xalloc_die (); - -@@ -845,7 +837,9 @@ filter_mount_list (bool devices_only) - me = device_list->me; - me->me_next = mount_list; - mount_list = me; -- device_list = device_list->next; -+ struct devlist *next = device_list->next; -+ free (device_list); -+ device_list = next; - } - - hash_free (devlist_table); diff --git a/backport-ls-avoid-triggering-automounts.patch b/backport-ls-avoid-triggering-automounts.patch deleted file mode 100644 index 3a7bbbfba786dbb9aa46e1a07bcc520dd41a67f0..0000000000000000000000000000000000000000 --- a/backport-ls-avoid-triggering-automounts.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 85c975df2c25bd799370b04bb294e568e001102f Mon Sep 17 00:00:00 2001 -From: Rohan Sable -Date: Mon, 7 Mar 2022 14:14:13 +0000 -Subject: [PATCH] ls: avoid triggering automounts - -statx() has different defaults wrt automounting -compared to stat() or lstat(), so explicitly -set the AT_NO_AUTOMOUNT flag to suppress that behavior, -and avoid unintended operations or potential errors. - -* src/ls.c (do_statx): Pass AT_NO_AUTOMOUNT to avoid this behavior. -* NEWS: Mention the change in behavior. -Fixes https://bugs.gnu.org/54286 - -Signed-off-by: Rohan Sable ---- - src/ls.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ls.c b/src/ls.c -index 1930e4abbc..255789061b 100644 ---- a/src/ls.c -+++ b/src/ls.c -@@ -1177,7 +1177,7 @@ do_statx (int fd, char const *name, struct stat *st, int flags, - { - struct statx stx; - bool want_btime = mask & STATX_BTIME; -- int ret = statx (fd, name, flags, mask, &stx); -+ int ret = statx (fd, name, flags | AT_NO_AUTOMOUNT, mask, &stx); - if (ret >= 0) - { - statx_to_stat (&stx, st); diff --git a/backport-sort-fix-sort-g-infloop-again.patch b/backport-sort-fix-sort-g-infloop-again.patch deleted file mode 100644 index 7ad4f1e372142eb1f72aa7dfaf0a88ea9086dbce..0000000000000000000000000000000000000000 --- a/backport-sort-fix-sort-g-infloop-again.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 2f56f5a42033dc6db15d8963e54566f01fa0d61d Mon Sep 17 00:00:00 2001 -From: Paul Eggert -Date: Sun, 1 May 2022 22:46:21 -0700 -Subject: [PATCH] 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. ---- - src/sort.c | 21 ++++++--------------- - 1 files changed, 6 insertions(+), 15 deletions(-) - -diff --git a/src/sort.c b/src/sort.c -index 3b775d6bb..b2a465cf5 100644 ---- a/src/sort.c -+++ b/src/sort.c -@@ -2359,22 +2359,13 @@ numcompare (char const *a, char const *b) - } - #endif /* HAV_EMBRTOWC */ - --/* 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 -@@ -2402,7 +2393,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/backport-stat-only-automount-with-cached-never.patch b/backport-stat-only-automount-with-cached-never.patch deleted file mode 100644 index 0c7df8bd355168397094d851242115da8c9e57dd..0000000000000000000000000000000000000000 --- a/backport-stat-only-automount-with-cached-never.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 92cb8427c537f37edd43c5cef1909585201372ab Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -Date: Mon, 7 Mar 2022 23:29:20 +0000 -Subject: [PATCH] stat: only automount with --cached=never - -Revert to the default behavior before the introduction of statx(). - -* src/stat.c (do_stat): Set AT_NO_AUTOMOUNT without --cached=never. -* doc/coreutils.texi (stat invocation): Mention the automount -behavior with --cached=never. -* NEWS: Mention the change in behavior. - -Fixes https://bugs.gnu.org/54287 ---- - doc/coreutils.texi | 1 + - src/stat.c | 3 +++ - 2 files changed, 4 insertions(+) - -diff --git a/doc/coreutils.texi b/doc/coreutils.texi -index e9be0993ac..05dc5ee21f 100644 ---- a/doc/coreutils.texi -+++ b/doc/coreutils.texi -@@ -12608,6 +12608,7 @@ Always read the already cached attributes if available. - - @item never - Always sychronize with the latest file system attributes. -+This also mounts automounted files. - - @item default - Leave the caching behavior to the underlying file system. -diff --git a/src/stat.c b/src/stat.c -index edafd02854..3765a8f65a 100644 ---- a/src/stat.c -+++ b/src/stat.c -@@ -1394,6 +1394,9 @@ do_stat (char const *filename, char const *format, char const *format2) - else if (force_sync) - flags |= AT_STATX_FORCE_SYNC; - -+ if (! force_sync) -+ flags |= AT_NO_AUTOMOUNT; -+ - fd = statx (fd, pathname, flags, format_to_mask (format), &stx); - if (fd < 0) - { diff --git a/backport-tests-sort-NaN-infloop-augment-testing-for-recent-fi.patch b/backport-tests-sort-NaN-infloop-augment-testing-for-recent-fi.patch deleted file mode 100644 index b02ae610dfecccf34cc7963e653afb44c44a04fe..0000000000000000000000000000000000000000 --- a/backport-tests-sort-NaN-infloop-augment-testing-for-recent-fi.patch +++ /dev/null @@ -1,43 +0,0 @@ -From ddafdae21c574b1dcd5c56e403c82010e7ed3565 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -Date: Mon, 2 May 2022 14:27:34 +0100 -Subject: [PATCH] tests: sort-NaN-infloop: augment testing for recent fix - -* tests/misc/sort-NaN-infloop.sh: Add test case from -https://unix.stackexchange.com/a/700967/37127 -* src/sort.c: Avoid syntax-check failure. ---- - src/sort.c | 2 +- - tests/misc/sort-NaN-infloop.sh | 3 +++ - 2 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/sort.c b/src/sort.c -index b2a465cf5..8af356c66 100644 ---- a/src/sort.c -+++ b/src/sort.c -@@ -2006,7 +2006,7 @@ numcompare (char const *a, char const *b) - static int - nan_compare (long double a, long double b) - { -- char buf[2][sizeof "-nan()" + CHAR_BIT * 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]); -diff --git a/tests/misc/sort-NaN-infloop.sh b/tests/misc/sort-NaN-infloop.sh -index 93cf9bd77..cc1c583cd 100755 ---- a/tests/misc/sort-NaN-infloop.sh -+++ b/tests/misc/sort-NaN-infloop.sh -@@ -23,6 +23,9 @@ echo nan > F || framework_failure_ - printf 'nan\nnan\n' > exp || framework_failure_ - timeout 10 sort -g -m F F > out || fail=1 - -+# This was seen to infloop on some systems until coreutils v9.2 (bug 55212) -+yes nan | head -n128095 | timeout 60 sort -g > /dev/null || fail=1 -+ - compare exp out || fail=1 - - Exit $fail --- -2.27.0 - diff --git a/backport-timeout-ensure-foreground-k-exits-with-status-137.patch b/backport-timeout-ensure-foreground-k-exits-with-status-137.patch deleted file mode 100644 index 8e453587eab2ab0e5fa241394e2b004522517ef8..0000000000000000000000000000000000000000 --- a/backport-timeout-ensure-foreground-k-exits-with-status-137.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 0750fcdf3447366b074cb47dd8cbe88c83ed984d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?P=C3=A1draig=20Brady?= -Date: Tue, 12 Oct 2021 14:32:57 +0100 -Subject: [PATCH] timeout: ensure --foreground -k exits with status 137 - -* src/timeout.c (main): Propagate the killed status from the child. -* doc/coreutils.texi (timeout invocation): Remove the -description of the --foreground specific handling of SIGKILL, -now that it's consistent with the default mode of operation. -* tests/misc/timeout.sh: Add a test case. -* NEWS: Mention the change in behavior. -Fixes https://bugs.gnu.org/51135 ---- - src/timeout.c | 5 +++++ - tests/misc/timeout.sh | 3 +++ - 2 files changed, 15 insertions(+), 3 deletions(-) - -diff --git a/src/timeout.c b/src/timeout.c -index 34d7926408..6505634617 100644 ---- a/src/timeout.c -+++ b/src/timeout.c -@@ -593,6 +593,11 @@ main (int argc, char **argv) - unblock_signal (sig); - raise (sig); - } -+ /* Allow users to distinguish if command was forcably killed. -+ Needed with --foreground where we don't send SIGKILL to -+ the timeout process itself. */ -+ if (timed_out && sig == SIGKILL) -+ preserve_status = true; - status = sig + 128; /* what sh returns for signaled processes. */ - } - else -diff --git a/tests/misc/timeout.sh b/tests/misc/timeout.sh -index 44ca450d81..295a95773b 100755 ---- a/tests/misc/timeout.sh -+++ b/tests/misc/timeout.sh -@@ -42,7 +42,10 @@ returns_ 124 timeout --preserve-status .1 sleep 10 && fail=1 - # kill delay. Note once the initial timeout triggers, - # the exit status will be 124 even if the command - # exits on its own accord. -+# exit status should be 128+KILL - returns_ 124 timeout -s0 -k1 .1 sleep 10 && fail=1 -+# Ensure a consistent exit status with --foreground -+returns_ 124 timeout --foreground -s0 -k1 .1 sleep 10 && fail=1 - - # Ensure 'timeout' is immune to parent's SIGCHLD handler - # Use a subshell and an exec to work around a bug in FreeBSD 5.0 /bin/sh. diff --git a/bugfix-dummy_help2man.patch b/bugfix-dummy_help2man.patch deleted file mode 100644 index c4fc4f0fe4872c085c47eb1566aed6fe70768c92..0000000000000000000000000000000000000000 --- a/bugfix-dummy_help2man.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/man/local.mk b/man/local.mk -index 05d4401..601f459 100644 ---- a/man/local.mk -+++ b/man/local.mk -@@ -23,11 +23,11 @@ if CROSS_COMPILING - run_help2man = $(SHELL) $(srcdir)/man/dummy-man - else - ## Graceful degradation for systems lacking perl. --if HAVE_PERL --run_help2man = $(PERL) -- $(srcdir)/man/help2man --else -+#if HAVE_PERL -+#run_help2man = $(PERL) -- $(srcdir)/man/help2man -+#else - run_help2man = $(SHELL) $(srcdir)/man/dummy-man --endif -+#endif - endif - - man1_MANS = @man1_MANS@ diff --git a/bugfix-remove-usr-local-lib-from-m4.patch b/bugfix-remove-usr-local-lib-from-m4.patch deleted file mode 100644 index 6ed2fbb44e3f138129e7d468ca33a54aeaefce03..0000000000000000000000000000000000000000 --- a/bugfix-remove-usr-local-lib-from-m4.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 28499fa6b233ffe0db6f406b8210ab89c51ca9e8 Mon Sep 17 00:00:00 2001 -From: openEuler Buildteam -Date: Wed, 29 Jul 2020 11:59:54 +0800 -Subject: [PATCH] bugfix remove usr local lib from m4 - ---- - m4/getloadavg.m4 | 12 ------------ - 1 file changed, 12 deletions(-) - -diff --git a/m4/getloadavg.m4 b/m4/getloadavg.m4 -index 8e96965..63782a2 100644 ---- a/m4/getloadavg.m4 -+++ b/m4/getloadavg.m4 -@@ -41,18 +41,6 @@ AC_CHECK_FUNC([getloadavg], [], - [LIBS="-lutil $LIBS" gl_func_getloadavg_done=yes]) - fi - -- if test $gl_func_getloadavg_done = no; then -- # There is a commonly available library for RS/6000 AIX. -- # Since it is not a standard part of AIX, it might be installed locally. -- gl_getloadavg_LIBS=$LIBS -- if test $cross_compiling != yes; then -- LIBS="-L/usr/local/lib $LIBS" -- fi -- AC_CHECK_LIB([getloadavg], [getloadavg], -- [LIBS="-lgetloadavg $LIBS" gl_func_getloadavg_done=yes], -- [LIBS=$gl_getloadavg_LIBS]) -- fi -- - # Set up the replacement function if necessary. - if test $gl_func_getloadavg_done = no; then - HAVE_GETLOADAVG=0 --- -2.23.0 - diff --git a/bugfix-selinux-flask.patch b/bugfix-selinux-flask.patch deleted file mode 100644 index 83839fa7bc79a53303b174c38b703c6f09cc3f9b..0000000000000000000000000000000000000000 --- a/bugfix-selinux-flask.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 1e764c5b9a3eb9a73370dbcbc04c2462c31aaf45 Mon Sep 17 00:00:00 2001 -From: openEuler Buildteam -Date: Wed, 29 Jul 2020 11:55:45 +0800 -Subject: [PATCH] bugfix selinux flask - ---- - m4/gnulib-comp.m4 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 -index dead90e..0abf0bd 100644 ---- a/m4/gnulib-comp.m4 -+++ b/m4/gnulib-comp.m4 -@@ -1860,11 +1860,11 @@ AC_DEFUN([gl_INIT], - AC_LIBOBJ([select]) - fi - gl_SYS_SELECT_MODULE_INDICATOR([select]) -- AC_CHECK_HEADERS([selinux/flask.h]) - gl_HEADERS_SELINUX_SELINUX_H - gl_HEADERS_SELINUX_CONTEXT_H - gl_HEADERS_SELINUX_LABEL_H - if test "$with_selinux" != no && test "$ac_cv_header_selinux_selinux_h" = yes; then -+ AC_CHECK_HEADERS([selinux/flask.h]) - AC_LIBOBJ([getfilecon]) - fi - gl_SERVENT --- -2.23.0 - diff --git a/coreutils-8.2-uname-processortype.patch b/coreutils-8.2-uname-processortype.patch deleted file mode 100644 index ed01ab80d03c9f619f49bb05051702f5876a800e..0000000000000000000000000000000000000000 --- a/coreutils-8.2-uname-processortype.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff --git a/src/uname.c b/src/uname.c -index 6371ca2..1ad8fd7 100644 ---- a/src/uname.c -+++ b/src/uname.c -@@ -300,13 +300,19 @@ main (int argc, char **argv) - - if (toprint & PRINT_PROCESSOR) - { -- char const *element = unknown; -+ char *element = unknown; - #if HAVE_SYSINFO && defined SI_ARCHITECTURE - { - static char processor[257]; - if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) - element = processor; - } -+#else -+ { -+ static struct utsname u; -+ uname(&u); -+ element = u.machine; -+ } - #endif - #ifdef UNAME_PROCESSOR - if (element == unknown) -@@ -344,7 +350,7 @@ main (int argc, char **argv) - - if (toprint & PRINT_HARDWARE_PLATFORM) - { -- char const *element = unknown; -+ char *element = unknown; - #if HAVE_SYSINFO && defined SI_PLATFORM - { - static char hardware_platform[257]; -@@ -352,6 +358,14 @@ main (int argc, char **argv) - hardware_platform, sizeof hardware_platform)) - element = hardware_platform; - } -+#else -+ { -+ static struct utsname u; -+ uname(&u); -+ element = u.machine; -+ if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6') -+ element[1]='3'; -+ } - #endif - #ifdef UNAME_HARDWARE_PLATFORM - if (element == unknown) diff --git a/coreutils-8.32-DIR_COLORS.patch b/coreutils-8.32-DIR_COLORS.patch new file mode 100644 index 0000000000000000000000000000000000000000..14997a22edc92ce41bd5fa89a2dc3b3cf4dce5a1 --- /dev/null +++ b/coreutils-8.32-DIR_COLORS.patch @@ -0,0 +1,100 @@ +From c7b13f5e1a7ad012c510a8bdd5a8943ab4b55833 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Fri, 17 Jun 2016 16:58:18 +0200 +Subject: [PATCH] downstream changes to default DIR_COLORS + +--- + DIR_COLORS | 9 ++++++++- + DIR_COLORS.lightbgcolor | 21 +++++++++++++++------ + 2 files changed, 23 insertions(+), 7 deletions(-) + +diff --git a/DIR_COLORS b/DIR_COLORS +index b465771..ad42b09 100644 +--- a/DIR_COLORS ++++ b/DIR_COLORS +@@ -1,3 +1,7 @@ ++# This file goes in the /etc directory, and must be world readable. ++# You can override the system defaults by making a copy of this file ++# as ~/.dir_colors ++ + # Configuration file for dircolors, a utility to help you set the + # LS_COLORS environment variable used by GNU ls with the --color option. + +@@ -10,6 +14,9 @@ + + # Global config options can be specified before TERM or COLORTERM entries + ++# For compatibility, the pattern "^COLOR.*none" is recognized as a way to ++# disable colorization. See https://bugzilla.redhat.com/1349579 for details. ++ + # Below are TERM or COLORTERM entries, which can be glob patterns, which + # restrict following config to systems with matching environment variables. + COLORTERM ?* +@@ -62,7 +69,7 @@ DOOR 01;35 # door + BLK 40;33;01 # block device driver + CHR 40;33;01 # character device driver + ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ... +-MISSING 00 # ... and the files they point to ++MISSING 01;37;41 # ... and the files they point to + SETUID 37;41 # file that is setuid (u+s) + SETGID 30;43 # file that is setgid (g+s) + CAPABILITY 00 # file with capability (very expensive to lookup) +diff --git a/DIR_COLORS.lightbgcolor b/DIR_COLORS.lightbgcolor +index eab6258..1627b63 100644 +--- a/DIR_COLORS.lightbgcolor ++++ b/DIR_COLORS.lightbgcolor +@@ -1,3 +1,9 @@ ++# Configuration file for the color ls utility - modified for lighter backgrounds ++ ++# This file goes in the /etc directory, and must be world readable. ++# You can override the system defaults by making a copy of this file ++# as ~/.dir_colors ++ + # Configuration file for dircolors, a utility to help you set the + # LS_COLORS environment variable used by GNU ls with the --color option. + +@@ -10,6 +16,9 @@ + + # Global config options can be specified before TERM or COLORTERM entries + ++# For compatibility, the pattern "^COLOR.*none" is recognized as a way to ++# disable colorization. See https://bugzilla.redhat.com/1349579 for details. ++ + # Below are TERM or COLORTERM entries, which can be glob patterns, which + # restrict following config to systems with matching environment variables. + COLORTERM ?* +@@ -52,17 +61,17 @@ TERM xterm* + #NORMAL 00 # no color code at all + #FILE 00 # regular file: use no color at all + RESET 0 # reset to "normal" color +-DIR 01;34 # directory +-LINK 01;36 # symbolic link. (If you set this to 'target' instead of a ++DIR 00;34 # directory ++LINK 00;36 # symbolic link. (If you set this to 'target' instead of a + # numerical value, the color is as for the file pointed to.) + MULTIHARDLINK 00 # regular file with more than one link + FIFO 40;33 # pipe +-SOCK 01;35 # socket +-DOOR 01;35 # door ++SOCK 00;35 # socket ++DOOR 00;35 # door + BLK 40;33;01 # block device driver + CHR 40;33;01 # character device driver + ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ... +-MISSING 00 # ... and the files they point to ++MISSING 01;37;41 # ... and the files they point to + SETUID 37;41 # file that is setuid (u+s) + SETGID 30;43 # file that is setgid (g+s) + CAPABILITY 00 # file with capability (very expensive to lookup) +@@ -71,7 +80,7 @@ OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky + STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable + + # This is for files with execute permission: +-EXEC 01;32 ++EXEC 00;32 + + # List any file extensions like '.gz' or '.tar' that you would like ls + # to color below. Put the extension, a space, and the color init string. +-- +2.34.1 + diff --git a/coreutils-9.0.tar.xz b/coreutils-9.1.tar.xz similarity index 43% rename from coreutils-9.0.tar.xz rename to coreutils-9.1.tar.xz index 782c214d2ab0445bf7b16c933838b5f88c16d198..6e86ecc068cc0c7ed0911ee2eba5bd0e6ae59e81 100644 Binary files a/coreutils-9.0.tar.xz and b/coreutils-9.1.tar.xz differ diff --git a/coreutils.spec b/coreutils.spec index 5d92b8e349bb2a6042049df5362069259ffc0d54..c3e264316221e44572e06ad8e5781212f3a70a46 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -1,6 +1,6 @@ Name: coreutils -Version: 9.0 -Release: 6 +Version: 9.1 +Release: 1 License: GPLv3+ Summary: A set of basic GNU tools commonly used in shell scripts Url: https://www.gnu.org/software/coreutils/ @@ -10,29 +10,27 @@ Source0: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz %global __requires_exclude ^%{_bindir}/coreutils$ %global user `ls -ld $USR_SCONF|awk '{print $3}'` +#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 Patch0: 0001-disable-test-of-rwlock.patch -# uname -p/-i to display processor type -Patch1: coreutils-8.2-uname-processortype.patch Patch2: coreutils-getgrouplist.patch -Patch3: bugfix-remove-usr-local-lib-from-m4.patch -Patch4: bugfix-dummy_help2man.patch -Patch5: bugfix-selinux-flask.patch Patch6: skip-the-tests-that-require-selinux-if-selinux-is-di.patch -Patch7: backport-chmod-fix-exit-status-when-ignoring-symlinks.patch -Patch8: backport-timeout-ensure-foreground-k-exits-with-status-137.patch -Patch9: backport-dd-improve-integer-overflow-checking.patch -Patch10: backport-dd-do-not-access-uninitialized.patch -Patch11: backport-df-fix-memory-leak.patch -Patch12: backport-ls-avoid-triggering-automounts.patch -Patch13: backport-stat-only-automount-with-cached-never.patch Patch14: backport-config-color-alias-for-ls.patch Patch15: backport-coreutils-i18n.patch -Patch16: backport-sort-fix-sort-g-infloop-again.patch -Patch17: backport-tests-sort-NaN-infloop-augment-testing-for-recent-fi.patch Patch9000: openEuler-coreutils-df-direct.patch +# Make simple backups in correct dir; broken in 9.1 +Patch9001: gnulib-simple-backup-fix.patch + +# downstream changes to default DIR_COLORS +Patch9002: coreutils-8.32-DIR_COLORS.patch + +# add info about TZ envvar to date manpage +Patch9003: sh-utils-2.0.11-dateman.patch + Conflicts: filesystem < 3 # To avoid clobbering installs Provides: /bin/sh @@ -153,6 +151,9 @@ fi %{_mandir}/man*/* %changelog +* Thu Oct 13 2022 dillon chen - 9.1-1 +- update to 9.1 + * Sat Aug 27 2022 zoulin - 9.0-6 - fix 'sort -g' don't meet expectations diff --git a/gnulib-simple-backup-fix.patch b/gnulib-simple-backup-fix.patch new file mode 100644 index 0000000000000000000000000000000000000000..9c2d8a7cc0fc7dbe16ffe351460b30b081bc4411 --- /dev/null +++ b/gnulib-simple-backup-fix.patch @@ -0,0 +1,36 @@ +commit 7347caeb9d902d3fca2c11f69a55a3e578d93bfe +Author: Paul Eggert +Date: Wed Apr 20 19:34:57 2022 -0700 + + backupfile: fix bug when renaming simple backups + + * lib/backupfile.c (backupfile_internal): Fix bug when RENAME + and when doing simple backups. Problem reported by Steve Ward in: + https://bugs.gnu.org/55029 + +diff --git a/lib/backupfile.c b/lib/backupfile.c +index 1e9290a187..d9f465a3e0 100644 +--- a/lib/backupfile.c ++++ b/lib/backupfile.c +@@ -332,7 +332,7 @@ backupfile_internal (int dir_fd, char const *file, + return s; + + DIR *dirp = NULL; +- int sdir = AT_FDCWD; ++ int sdir = dir_fd; + idx_t base_max = 0; + while (true) + { +@@ -371,10 +371,9 @@ backupfile_internal (int dir_fd, char const *file, + if (! rename) + break; + +- int olddirfd = sdir < 0 ? dir_fd : sdir; +- idx_t offset = sdir < 0 ? 0 : base_offset; ++ idx_t offset = backup_type == simple_backups ? 0 : base_offset; + unsigned flags = backup_type == simple_backups ? 0 : RENAME_NOREPLACE; +- if (renameatu (olddirfd, file + offset, sdir, s + offset, flags) == 0) ++ if (renameatu (sdir, file + offset, sdir, s + offset, flags) == 0) + break; + int e = errno; + if (! (e == EEXIST && extended)) diff --git a/sh-utils-2.0.11-dateman.patch b/sh-utils-2.0.11-dateman.patch new file mode 100644 index 0000000000000000000000000000000000000000..60cdaa6cfdb0c495ed4305d6848e412028d73b9a --- /dev/null +++ b/sh-utils-2.0.11-dateman.patch @@ -0,0 +1,12 @@ +diff -urNp coreutils-5.97-orig/man/date.x coreutils-5.97/man/date.x +--- coreutils-5.97-orig/man/date.x 1999-11-02 15:07:36.000000000 +0100 ++++ coreutils-5.97/man/date.x 2008-10-15 10:13:31.000000000 +0200 +@@ -11,3 +11,8 @@ calendar date, time of day, time zone, day of week, relative time, + relative date, and numbers. An empty string indicates the beginning + of the day. The date string format is more complex than is easily + documented here but is fully described in the info documentation. ++[ENVIRONMENT] ++.TP ++TZ ++Specifies the timezone, unless overridden by command line parameters. ++If neither is specified, the setting from /etc/localtime is used.