coreutils: update to 9.3
This commit is contained in:
parent
7000ed33d5
commit
f4d9057e7f
@ -1,86 +0,0 @@
|
||||
From 708ae170c987dab83273cb885496e1a8a90233e8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Sat, 27 Aug 2022 18:40:14 +0100
|
||||
Subject: [PATCH] comm: fix NUL --output-delimiter with --total
|
||||
|
||||
* src/comm.c (compare_files): Handle the single character
|
||||
--output-delimeter case separately so that NUL is appropriately
|
||||
handled.
|
||||
* doc/coreutils.texi (comm invocation): Fix the description
|
||||
of --output-delimiter to say an empty delimeter is treated
|
||||
as a NUL separator, rather than being disallowed.
|
||||
* tests/misc/comm.pl: Add a test case.
|
||||
Reported at https://bugs.debian.org/1014008
|
||||
|
||||
Reference:https://github.com/coreutils/coreutils/commit/708ae170c987dab83273cb885496e1a8a90233e8
|
||||
Conflict:Context adaptation
|
||||
|
||||
---
|
||||
doc/coreutils.texi | 3 ++-
|
||||
src/comm.c | 21 ++++++++++++++++-----
|
||||
tests/misc/comm.pl | 3 +++
|
||||
3 files changed, 21 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
||||
index 9f31f6768..de819b6dc 100644
|
||||
--- a/doc/coreutils.texi
|
||||
+++ b/doc/coreutils.texi
|
||||
@@ -5427,7 +5427,8 @@ Other options are:
|
||||
Print @var{str} between adjacent output columns,
|
||||
rather than the default of a single TAB character.
|
||||
|
||||
-The delimiter @var{str} may not be empty.
|
||||
+The delimiter @var{str} may be empty, in which case
|
||||
+the ASCII NUL character is used to delimit output columns.
|
||||
|
||||
@item --total
|
||||
Output a summary at the end.
|
||||
diff --git a/src/comm.c b/src/comm.c
|
||||
index 721139cb8..ed9d97d0a 100644
|
||||
--- a/src/comm.c
|
||||
+++ b/src/comm.c
|
||||
@@ -395,11 +395,22 @@ compare_files (char **infiles)
|
||||
char buf1[INT_BUFSIZE_BOUND (uintmax_t)];
|
||||
char buf2[INT_BUFSIZE_BOUND (uintmax_t)];
|
||||
char buf3[INT_BUFSIZE_BOUND (uintmax_t)];
|
||||
- printf ("%s%s%s%s%s%s%s%c",
|
||||
- umaxtostr (total[0], buf1), col_sep,
|
||||
- umaxtostr (total[1], buf2), col_sep,
|
||||
- umaxtostr (total[2], buf3), col_sep,
|
||||
- _("total"), delim);
|
||||
+ if (col_sep_len == 1)
|
||||
+ { /* Separate to handle NUL char. */
|
||||
+ printf ("%s%c%s%c%s%c%s%c",
|
||||
+ umaxtostr (total[0], buf1), *col_sep,
|
||||
+ umaxtostr (total[1], buf2), *col_sep,
|
||||
+ umaxtostr (total[2], buf3), *col_sep,
|
||||
+ _("total"), delim);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ printf ("%s%s%s%s%s%s%s%c",
|
||||
+ umaxtostr (total[0], buf1), col_sep,
|
||||
+ umaxtostr (total[1], buf2), col_sep,
|
||||
+ umaxtostr (total[2], buf3), col_sep,
|
||||
+ _("total"), delim);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/tests/misc/comm.pl b/tests/misc/comm.pl
|
||||
index 73e8c3720..5d0c4f175 100755
|
||||
--- a/tests/misc/comm.pl
|
||||
+++ b/tests/misc/comm.pl
|
||||
@@ -157,6 +157,9 @@ my @Tests =
|
||||
{OUT=>"1\n\0002\n\0002\n\000\0003\n\000\0003\n\000\0003\n"} ],
|
||||
['zdelim-empty', '-z', '-z --output-delimiter=', @zinputs,
|
||||
{OUT=>"1\000\0002\000\0002\000\000\0003\000\000\0003\000\000\0003\000"} ],
|
||||
+ ['total-delim-empty', '--total --output-delimiter=', @inputs,
|
||||
+ {OUT=>"1\n\0002\n\0002\n\000\0003\n\000\0003\n\000\0003\n"
|
||||
+ . "1\0002\0003\000total\n"} ],
|
||||
|
||||
# invalid dual delimiter
|
||||
['delim-dual', '--output-delimiter=,', '--output-delimiter=+', @inputs,
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,54 +0,0 @@
|
||||
From 7fc84d1c0f6b35231b0b4577b70aaa26bf548a7c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Sat, 7 Jan 2023 16:10:01 +0000
|
||||
Subject: [PATCH] copy: copy_file_range: handle ENOENT for CIFS
|
||||
|
||||
* src/copy.c (sparse_copy): Fallback to standard copy upon ENOENT,
|
||||
which was seen intermittently across CIFS file systems.
|
||||
* NEWS: Mention the bug fix, though qualify it as an "issue"
|
||||
rather than a bug, as coreutils is likely only highlighting
|
||||
a CIFS bug in this case.
|
||||
Fixes https://bugs.gnu.org/60455
|
||||
|
||||
Reference:https://github.com/coreutils/coreutils/commit/7fc84d1c0f6b35231b0b4577b70aaa26bf548a7c
|
||||
Conflict:NEWS context adapation
|
||||
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
src/copy.c | 5 +++++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 9d3f253..b65bc85 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,10 @@ GNU coreutils NEWS -*- outline -*-
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+ cp, mv, and install now handle ENOENT failures across CIFS file systems,
|
||||
+ falling back from copy_file_range to a better supported standard copy.
|
||||
+ [issue introduced in coreutils-9.0]
|
||||
+
|
||||
stty now wraps output appropriately for the terminal width.
|
||||
Previously it may have output 1 character too wide for certain widths.
|
||||
[bug introduced in coreutils-5.3]
|
||||
diff --git a/src/copy.c b/src/copy.c
|
||||
index 519c43b00..98f2ba45a 100644
|
||||
--- a/src/copy.c
|
||||
+++ b/src/copy.c
|
||||
@@ -290,6 +290,11 @@ sparse_copy (int src_fd, int dest_fd, char **abuf, size_t buf_size,
|
||||
if (errno == EPERM && *total_n_read == 0)
|
||||
break;
|
||||
|
||||
+ /* ENOENT was seen sometimes across CIFS shares, resulting in
|
||||
+ no data being copied, but subsequent standard copies succeed. */
|
||||
+ if (errno == ENOENT && *total_n_read == 0)
|
||||
+ break;
|
||||
+
|
||||
if (errno == EINTR)
|
||||
n_copied = 0;
|
||||
else
|
||||
--
|
||||
2.27.0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,41 +0,0 @@
|
||||
From 604f8a6c4d58a646c8722fdf7cad9ee67479d8f7 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1,833 +0,0 @@
|
||||
From e94d95075dd919e5e6ec0c8ed09477e58b863788 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
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
|
||||
@ -1,51 +0,0 @@
|
||||
From fb7579768d688a300c4ac76451e1fc7cad59e3e8 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
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);
|
||||
@ -1,50 +0,0 @@
|
||||
From f17d397771164c1b0f77fea8fb0abdc99cf4a3e1 Mon Sep 17 00:00:00 2001
|
||||
From: ChuanGang Jiang <jiangchuanganghw@outlook.com>
|
||||
Date: Mon, 27 Feb 2023 11:46:12 +0000
|
||||
Subject: [PATCH] fts: fail gracefully when out of memory
|
||||
|
||||
* lib/fts.c (fts_read): Set errno==ENOMEM and return NULL
|
||||
when setup_dir() fails, rather than hitting an assertion later.
|
||||
|
||||
Refernece:https://github.com/coreutils/gnulib/commit/f17d397771164c1b0f77fea8fb0abdc99cf4a3e1
|
||||
Conflict:ChangeLog context adaptation
|
||||
|
||||
---
|
||||
ChangeLog | 6 ++++++
|
||||
lib/fts.c | 6 +++++-
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 1785234..43b0afa 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,9 @@
|
||||
+2023-02-27 ChuanGang Jiang <jiangchuanganghw@outlook.com>
|
||||
+
|
||||
+ fts: fail gracefully when out of memory
|
||||
+ * lib/fts.c (fts_read): Set errno==ENOMEM and return NULL
|
||||
+ when setup_dir() fails, rather than hitting an assertion later.
|
||||
+
|
||||
2022-12-06 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
fts: fix race + mishandling of fstatat failure
|
||||
diff --git a/lib/fts.c b/lib/fts.c
|
||||
index 78584b2902..794a4f75d7 100644
|
||||
--- a/lib/fts.c
|
||||
+++ b/lib/fts.c
|
||||
@@ -979,7 +979,11 @@ next: tmp = p;
|
||||
}
|
||||
free_dir(sp);
|
||||
fts_load(sp, p);
|
||||
- setup_dir(sp);
|
||||
+ if (! setup_dir(sp)) {
|
||||
+ free_dir(sp);
|
||||
+ __set_errno (ENOMEM);
|
||||
+ return (NULL);
|
||||
+ }
|
||||
goto check_for_dir;
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,96 +0,0 @@
|
||||
From 440b528b1d81dd31b2a2e4dde20d5c837c147811 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
Date: Tue, 6 Dec 2022 10:27:43 -0800
|
||||
Subject: [PATCH] fts: fix race + mishandling of fstatat failure
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
I hope this fixes a Luke Dashjr coreutils bug report about ext4
|
||||
ramdisks; see “9.1: du Aborted (corrupt filesystem)”
|
||||
<https://debbugs.gnu.org/59821>.
|
||||
* lib/fts.c (fts_build): Fix two bugs. First, fts_stat was being
|
||||
called without checking its return value, causing a later abort.
|
||||
Second, there was a race between opening a directory and statting
|
||||
it, fixed by using fstat on the file descriptor rather than
|
||||
fstatat on the directory name.
|
||||
|
||||
Reference:https://github.com/coretuils/gnulib/commit/440b528b1d81dd31b2a2e4dde20d5c837c147811
|
||||
Conflict:Context adapation
|
||||
|
||||
---
|
||||
ChangeLog | 10 ++++++++++
|
||||
lib/fts.c | 32 ++++++++++++++++++++++++--------
|
||||
2 files changed, 34 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/ChangeLog b/ChangeLog
|
||||
index 44fe270..1785234 100644
|
||||
--- a/ChangeLog
|
||||
+++ b/ChangeLog
|
||||
@@ -1,3 +1,15 @@
|
||||
+2022-12-06 Paul Eggert <eggert@cs.ucla.edu>
|
||||
+
|
||||
+ fts: fix race + mishandling of fstatat failure
|
||||
+ I hope this fixes a Luke Dashjr coreutils bug report about ext4
|
||||
+ ramdisks; see “9.1: du Aborted (corrupt filesystem)”
|
||||
+ <https://debbugs.gnu.org/59821>.
|
||||
+ * lib/fts.c (fts_build): Fix two bugs. First, fts_stat was being
|
||||
+ called without checking its return value, causing a later abort.
|
||||
+ Second, there was a race between opening a directory and statting
|
||||
+ it, fixed by using fstat on the file descriptor rather than
|
||||
+ fstatat on the directory name.
|
||||
+
|
||||
2021-09-24 Pádraig Brady <P@draigBrady.com>
|
||||
|
||||
version 9.0
|
||||
diff --git a/lib/fts.c b/lib/fts.c
|
||||
index 27354d39c8..74a08f7ec8 100644
|
||||
--- a/lib/fts.c
|
||||
+++ b/lib/fts.c
|
||||
@@ -1316,19 +1316,35 @@ fts_build (register FTS *sp, int type)
|
||||
/* Rather than calling fts_stat for each and every entry encountered
|
||||
in the readdir loop (below), stat each directory only right after
|
||||
opening it. */
|
||||
- if (cur->fts_info == FTS_NSOK)
|
||||
- cur->fts_info = fts_stat(sp, cur, false);
|
||||
- else if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK)
|
||||
- {
|
||||
- /* Now read the stat info again after opening a directory to
|
||||
+ bool stat_optimization = cur->fts_info == FTS_NSOK;
|
||||
+
|
||||
+ if (stat_optimization
|
||||
+ /* Also read the stat info again after opening a directory to
|
||||
reveal eventual changes caused by a submount triggered by
|
||||
the traversal. But do it only for utilities which use
|
||||
FTS_TIGHT_CYCLE_CHECK. Therefore, only find and du
|
||||
benefit/suffer from this feature for now. */
|
||||
- LEAVE_DIR (sp, cur, "4");
|
||||
- fts_stat (sp, cur, false);
|
||||
- if (! enter_dir (sp, cur))
|
||||
+ || ISSET (FTS_TIGHT_CYCLE_CHECK))
|
||||
+ {
|
||||
+ if (!stat_optimization)
|
||||
+ LEAVE_DIR (sp, cur, "4");
|
||||
+ if (fstat (dir_fd, cur->fts_statp) != 0)
|
||||
+ {
|
||||
+ int fstat_errno = errno;
|
||||
+ closedir_and_clear (cur->fts_dirp);
|
||||
+ if (type == BREAD)
|
||||
+ {
|
||||
+ cur->fts_errno = fstat_errno;
|
||||
+ cur->fts_info = FTS_NS;
|
||||
+ }
|
||||
+ __set_errno (fstat_errno);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ if (stat_optimization)
|
||||
+ cur->fts_info = FTS_D;
|
||||
+ else if (! enter_dir (sp, cur))
|
||||
{
|
||||
+ closedir_and_clear (cur->fts_dirp);
|
||||
__set_errno (ENOMEM);
|
||||
return NULL;
|
||||
}
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,32 +0,0 @@
|
||||
From 85c975df2c25bd799370b04bb294e568e001102f Mon Sep 17 00:00:00 2001
|
||||
From: Rohan Sable <rsable@redhat.com>
|
||||
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 <rsable@redhat.com>
|
||||
---
|
||||
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);
|
||||
@ -25,15 +25,16 @@ index f65eb95..5320b9c 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,9 @@ GNU coreutils NEWS -*- outline -*-
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
* Noteworthy changes in release 9.3 (2023-04-18) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+
|
||||
+ 'pr --length=1 --double-space' no longer enters an infinite loop.
|
||||
+ [This bug was present in "the beginning".]
|
||||
+
|
||||
tail --follow=name works again with non seekable files. Previously it
|
||||
exited with an "Illegal seek" error when such a file was replaced.
|
||||
[bug introduced in fileutils-4.1.6]
|
||||
|
||||
cp --reflink=auto (the default), mv, and install
|
||||
will again fall back to a standard copy in more cases.
|
||||
Previously copies could fail with permission errors on
|
||||
diff --git a/src/pr.c b/src/pr.c
|
||||
index 2c5cdceb1..14a368b6c 100644
|
||||
--- a/src/pr.c
|
||||
|
||||
@ -1,57 +0,0 @@
|
||||
From 2f56f5a42033dc6db15d8963e54566f01fa0d61d Mon Sep 17 00:00:00 2001
|
||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||
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
|
||||
|
||||
@ -1,44 +0,0 @@
|
||||
From 92cb8427c537f37edd43c5cef1909585201372ab Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
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)
|
||||
{
|
||||
@ -1,66 +0,0 @@
|
||||
From c9a21ec3173b93de4839e5ff9eddadb020431656 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Sat, 31 Dec 2022 17:03:39 +0000
|
||||
Subject: [PATCH] stty: fix off by one column wrapping on output
|
||||
|
||||
* src/stty.c (wrapf): Adjust the comparison by 1,
|
||||
to account for the space we're adding.
|
||||
* tests/misc/stty.sh: Add a test case.
|
||||
* NEWS: Mention the fix.
|
||||
Reported in https://bugs.debian.org/1027442
|
||||
|
||||
Refernece:https://github.com/coreutils/coreutils/commit/c9a21ec3173b93de4839e5ff9eddadb020431656
|
||||
Conflict:NEWS Context adapation
|
||||
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
src/stty.c | 2 +-
|
||||
tests/misc/stty.sh | 6 ++++++
|
||||
3 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 805f012..9d3f253 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,10 @@ GNU coreutils NEWS
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+ stty now wraps output appropriately for the terminal width.
|
||||
+ Previously it may have output 1 character too wide for certain widths.
|
||||
+ [bug introduced in coreutils-5.3]
|
||||
+
|
||||
stty ispeed and ospeed options no longer accept and silently ignore
|
||||
invalid speed arguments. Now they're validated against both the
|
||||
general accepted set, and the system supported set of valid speeds.
|
||||
diff --git a/src/stty.c b/src/stty.c
|
||||
index b4c2cbecd..f3c7915e1 100644
|
||||
--- a/src/stty.c
|
||||
+++ b/src/stty.c
|
||||
@@ -519,7 +519,7 @@ wrapf (char const *message,...)
|
||||
|
||||
if (0 < current_col)
|
||||
{
|
||||
- if (max_col - current_col < buflen)
|
||||
+ if (max_col - current_col <= buflen)
|
||||
{
|
||||
putchar ('\n');
|
||||
current_col = 0;
|
||||
diff --git a/tests/misc/stty.sh b/tests/misc/stty.sh
|
||||
index bcdc80e87..7abcec5af 100755
|
||||
--- a/tests/misc/stty.sh
|
||||
+++ b/tests/misc/stty.sh
|
||||
@@ -89,4 +89,10 @@ returns_ 1 strace -o log2 -e ioctl stty -blahblah || fail=1
|
||||
n_ioctl2=$(wc -l < log2) || framework_failure_
|
||||
test "$n_ioctl1" = "$n_ioctl2" || fail=1
|
||||
|
||||
+# Ensure we wrap output appropriately
|
||||
+for W in $(seq 80 90); do
|
||||
+ output_width=$(COLUMNS="$W" stty -a | wc -L)
|
||||
+ test "$output_width" -le "$W" || fail=1
|
||||
+done
|
||||
+
|
||||
Exit $fail
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,110 +0,0 @@
|
||||
From f87a78f334f25cbaac89507c8fda24d4f780b908 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Wed, 31 Aug 2022 00:17:21 +0100
|
||||
Subject: [PATCH] stty: validate ispeed and ospeed arguments
|
||||
|
||||
* src/stty.c (apply_settings): Validate [io]speed arguments
|
||||
against the internal accepted set.
|
||||
(set_speed): Check the cfset[io]speed() return value so
|
||||
that we validate against the system supported set.
|
||||
* tests/misc/stty-invalid.sh: Add a test case.
|
||||
* NEWS: Mention the bug fix.
|
||||
Reported in https://bugs.debian.org/1018790
|
||||
|
||||
Reference:https://github.com/coreutils/coreutils/commit/f87a78f334f25cbaac89507c8fda24d4f780b908
|
||||
Conflict:Context adapation
|
||||
|
||||
---
|
||||
NEWS | 5 +++++
|
||||
src/stty.c | 29 +++++++++++++++++++++++++----
|
||||
tests/misc/stty-invalid.sh | 3 +++
|
||||
3 files changed, 33 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index f2fbcbb..805f012 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,10 @@ GNU coreutils NEWS
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+ stty ispeed and ospeed options no longer accept and silently ignore
|
||||
+ invalid speed arguments. Now they're validated against both the
|
||||
+ general accepted set, and the system supported set of valid speeds.
|
||||
+ [This bug was present in "the beginning".]
|
||||
|
||||
chmod -v no longer misreports modes of dangling symlinks.
|
||||
[bug introduced in coreutils-5.3.0]
|
||||
diff --git a/src/stty.c b/src/stty.c
|
||||
index 3b6a592a9..3d515223e 100644
|
||||
--- a/src/stty.c
|
||||
+++ b/src/stty.c
|
||||
@@ -1159,6 +1159,11 @@ apply_settings (bool checking, char const *device_name,
|
||||
{
|
||||
check_argument (arg);
|
||||
++k;
|
||||
+ if (string_to_baud (settings[k]) == (speed_t) -1)
|
||||
+ {
|
||||
+ error (0, 0, _("invalid ispeed %s"), quote (settings[k]));
|
||||
+ usage (EXIT_FAILURE);
|
||||
+ }
|
||||
if (checking)
|
||||
continue;
|
||||
set_speed (input_speed, settings[k], mode);
|
||||
@@ -1169,6 +1174,11 @@ apply_settings (bool checking, char const *device_name,
|
||||
{
|
||||
check_argument (arg);
|
||||
++k;
|
||||
+ if (string_to_baud (settings[k]) == (speed_t) -1)
|
||||
+ {
|
||||
+ error (0, 0, _("invalid ospeed %s"), quote (settings[k]));
|
||||
+ usage (EXIT_FAILURE);
|
||||
+ }
|
||||
if (checking)
|
||||
continue;
|
||||
set_speed (output_speed, settings[k], mode);
|
||||
@@ -1696,13 +1706,24 @@ set_control_char (struct control_info const *info, char const *arg,
|
||||
static void
|
||||
set_speed (enum speed_setting type, char const *arg, struct termios *mode)
|
||||
{
|
||||
- speed_t baud;
|
||||
+ /* Note cfset[io]speed(), do not check with the device,
|
||||
+ and only check whether the system logic supports the specified speed.
|
||||
+ Therefore we don't report the device name in any errors. */
|
||||
+
|
||||
+ speed_t baud = string_to_baud (arg);
|
||||
+
|
||||
+ assert (baud != (speed_t) -1);
|
||||
|
||||
- baud = string_to_baud (arg);
|
||||
if (type == input_speed || type == both_speeds)
|
||||
- cfsetispeed (mode, baud);
|
||||
+ {
|
||||
+ if (cfsetispeed (mode, baud))
|
||||
+ die (EXIT_FAILURE, 0, "unsupported ispeed %s", quotef (arg));
|
||||
+ }
|
||||
if (type == output_speed || type == both_speeds)
|
||||
- cfsetospeed (mode, baud);
|
||||
+ {
|
||||
+ if (cfsetospeed (mode, baud))
|
||||
+ die (EXIT_FAILURE, 0, "unsupported ospeed %s", quotef (arg));
|
||||
+ }
|
||||
}
|
||||
|
||||
#ifdef TIOCGWINSZ
|
||||
diff --git a/tests/misc/stty-invalid.sh b/tests/misc/stty-invalid.sh
|
||||
index 58e51311d..af49b8d89 100755
|
||||
--- a/tests/misc/stty-invalid.sh
|
||||
+++ b/tests/misc/stty-invalid.sh
|
||||
@@ -50,6 +50,9 @@ if tty -s </dev/tty; then
|
||||
returns_ 1 stty eol -F/dev/tty eol || fail=1
|
||||
fi
|
||||
|
||||
+# coreutils <= 9.1 would not validate speeds to ispeed or ospeed
|
||||
+returns_ 1 stty ispeed 420 || fail=1
|
||||
+
|
||||
# Just in case either of the above mistakenly succeeds (and changes
|
||||
# the state of our tty), try to restore the initial state.
|
||||
stty $saved_state || fail=1
|
||||
--
|
||||
2.27.0
|
||||
@ -1,53 +0,0 @@
|
||||
From c0c63e9735908a9579f8735001957db6bd81afc3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Mon, 30 Jan 2023 21:44:10 +0000
|
||||
Subject: [PATCH] tail: fix support for -F with non seekable files
|
||||
|
||||
This was seen to be an issue when following a
|
||||
symlink that was being updated to point to
|
||||
different underlying devices.
|
||||
|
||||
* src/tail.c (recheck): Guard the lseek() call to only
|
||||
be performed for regular files.
|
||||
* NEWS: Mention the bug fix.
|
||||
|
||||
Reference:https://github.com/coreutils/coreutils/commit/c0c63e9735908a9579f8735001957db6bd81afc3
|
||||
Conflict:NEWS Context adapation
|
||||
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
src/tail.c | 3 ++-
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index b65bc85..f65eb95 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,10 @@ GNU coreutils NEWS -*- outline -*-
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+ tail --follow=name works again with non seekable files. Previously it
|
||||
+ exited with an "Illegal seek" error when such a file was replaced.
|
||||
+ [bug introduced in fileutils-4.1.6]
|
||||
+
|
||||
cp, mv, and install now handle ENOENT failures across CIFS file systems,
|
||||
falling back from copy_file_range to a better supported standard copy.
|
||||
[issue introduced in coreutils-9.0]
|
||||
diff --git a/src/tail.c b/src/tail.c
|
||||
index 2244509dd..03061e8bf 100644
|
||||
--- a/src/tail.c
|
||||
+++ b/src/tail.c
|
||||
@@ -1122,7 +1122,8 @@ recheck (struct File_spec *f, bool blocking)
|
||||
{
|
||||
/* Start at the beginning of the file. */
|
||||
record_open_fd (f, fd, 0, &new_stats, (is_stdin ? -1 : blocking));
|
||||
- xlseek (fd, 0, SEEK_SET, pretty_name (f));
|
||||
+ if (S_ISREG (new_stats.st_mode))
|
||||
+ xlseek (fd, 0, SEEK_SET, pretty_name (f));
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
||||
@ -1,43 +0,0 @@
|
||||
From ddafdae21c574b1dcd5c56e403c82010e7ed3565 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
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
|
||||
|
||||
@ -1,48 +0,0 @@
|
||||
From 0750fcdf3447366b074cb47dd8cbe88c83ed984d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
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.
|
||||
@ -1,75 +0,0 @@
|
||||
From ce630dfc7ef32ff7e35c627bd061a45ce9053d9d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||
Date: Sun, 5 Feb 2023 19:52:31 +0000
|
||||
Subject: [PATCH] wc: ensure we update file offset
|
||||
|
||||
* src/wc.c (wc): Update the offset when not reading,
|
||||
and do read if we can't update the offset.
|
||||
* tests/misc/wc-proc.sh: Add a test case.
|
||||
* NEWS: Mention the bug fix.
|
||||
Fixes https://bugs.gnu.org/61300
|
||||
|
||||
Conflict:NEWS and tests/misc/wc-proc.sh context adaption
|
||||
Reference:https://github.com/coreutils/coreutils/commit/ce630dfc7ef32ff7e35c627bd061a45ce9053d9d
|
||||
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
src/wc.c | 5 ++++-
|
||||
tests/misc/wc-proc.sh | 12 ++++++++++++
|
||||
3 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 5320b9c..ce6e2b7 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -3,6 +3,10 @@ GNU coreutils NEWS -*- outline -*-
|
||||
* Noteworthy changes in release 9.0 (2021-09-24) [stable]
|
||||
|
||||
** Bug fixes
|
||||
+ `wc -c` will again correctly update the read offset of inputs.
|
||||
+ Previously it deduced the size of inputs while leaving the offset unchanged.
|
||||
+ [bug introduced in coreutils-8.27]
|
||||
+
|
||||
'pr --length=1 --double-space' no longer enters an infinite loop.
|
||||
[This bug was present in "the beginning".]
|
||||
|
||||
diff --git a/src/wc.c b/src/wc.c
|
||||
index 801396a15..becceda98 100644
|
||||
--- a/src/wc.c
|
||||
+++ b/src/wc.c
|
||||
@@ -450,7 +450,10 @@ wc (int fd, char const *file_x, struct fstatus *fstatus, off_t current_pos)
|
||||
beyond the end of the file. As in the example above. */
|
||||
|
||||
bytes = end_pos < current_pos ? 0 : end_pos - current_pos;
|
||||
- skip_read = true;
|
||||
+ if (bytes && 0 <= lseek (fd, bytes, SEEK_CUR))
|
||||
+ skip_read = true;
|
||||
+ else
|
||||
+ bytes = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
diff --git a/tests/misc/wc-proc.sh b/tests/misc/wc-proc.sh
|
||||
index 5eb43b982..2307f2c38 100755
|
||||
--- a/tests/misc/wc-proc.sh
|
||||
+++ b/tests/misc/wc-proc.sh
|
||||
@@ -42,4 +42,16 @@ cat <<\EOF > exp
|
||||
EOF
|
||||
compare exp out || fail=1
|
||||
|
||||
+# Ensure we update the offset even when not reading,
|
||||
+# which wasn't the case from coreutils-8.27 to coreutils-9.2
|
||||
+{ wc -c; wc -c; } < no_read > out || fail=1
|
||||
+{ wc -c; wc -c; } < do_read >> out || fail=1
|
||||
+cat <<\EOF > exp
|
||||
+2
|
||||
+0
|
||||
+1048576
|
||||
+0
|
||||
+EOF
|
||||
+compare exp out || fail=1
|
||||
+
|
||||
Exit $fail
|
||||
--
|
||||
2.36.1
|
||||
|
||||
@ -2,15 +2,21 @@ 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
|
||||
@@ -23,14 +23,14 @@ 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
|
||||
-if BOLD_MAN_REFS
|
||||
-help2man_OPTS=--bold-refs
|
||||
-endif
|
||||
-run_help2man = $(PERL) -- $(srcdir)/man/help2man $(help2man_OPTS)
|
||||
-else
|
||||
+#if HAVE_PERL
|
||||
+#run_help2man = $(PERL) -- $(srcdir)/man/help2man
|
||||
+#if BOLD_MAN_REFS
|
||||
+#help2man_OPTS=--bold-refs
|
||||
+#endif
|
||||
+#run_help2man = $(PERL) -- $(srcdir)/man/help2man $(help2man_OPTS)
|
||||
+#else
|
||||
run_help2man = $(SHELL) $(srcdir)/man/dummy-man
|
||||
-endif
|
||||
|
||||
@ -1,29 +0,0 @@
|
||||
From 1e764c5b9a3eb9a73370dbcbc04c2462c31aaf45 Mon Sep 17 00:00:00 2001
|
||||
From: openEuler Buildteam <buildteam@openeuler.org>
|
||||
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
|
||||
|
||||
@ -1,29 +1,30 @@
|
||||
diff --git a/src/uname.c b/src/uname.c
|
||||
index 6371ca2..1ad8fd7 100644
|
||||
index 921a881..512655d 100644
|
||||
--- a/src/uname.c
|
||||
+++ b/src/uname.c
|
||||
@@ -300,13 +300,19 @@ main (int argc, char **argv)
|
||||
@@ -313,7 +313,7 @@ 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;
|
||||
}
|
||||
#ifdef __APPLE__
|
||||
# if defined __arm__ || defined __arm64__
|
||||
element = "arm";
|
||||
@@ -330,6 +330,12 @@ main (int argc, char **argv)
|
||||
if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor))
|
||||
element = processor;
|
||||
}
|
||||
+#else
|
||||
+ {
|
||||
+ static struct utsname u;
|
||||
+ uname(&u);
|
||||
+ element = u.machine;
|
||||
+ 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)
|
||||
@@ -347,7 +353,7 @@ main (int argc, char **argv)
|
||||
|
||||
if (toprint & PRINT_HARDWARE_PLATFORM)
|
||||
{
|
||||
@ -32,17 +33,17 @@ index 6371ca2..1ad8fd7 100644
|
||||
#if HAVE_SYSINFO && defined SI_PLATFORM
|
||||
{
|
||||
static char hardware_platform[257];
|
||||
@@ -352,6 +358,14 @@ main (int argc, char **argv)
|
||||
@@ -355,6 +361,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';
|
||||
+ 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
|
||||
|
||||
Binary file not shown.
BIN
coreutils-9.3.tar.xz
Normal file
BIN
coreutils-9.3.tar.xz
Normal file
Binary file not shown.
@ -1,6 +1,6 @@
|
||||
Name: coreutils
|
||||
Version: 9.0
|
||||
Release: 10
|
||||
Version: 9.3
|
||||
Release: 1
|
||||
License: GPLv3+
|
||||
Summary: A set of basic GNU tools commonly used in shell scripts
|
||||
Url: https://www.gnu.org/software/coreutils/
|
||||
@ -17,28 +17,10 @@ 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
|
||||
Patch18: backport-comm-fix-NUL-output-delimiter-with-total.patch
|
||||
Patch19: backport-stty-validate-ispeed-and-ospeed-arguments.patch
|
||||
Patch20: backport-fts-fix-race-mishandling-of-fstatat-failure.patch
|
||||
Patch21: backport-stty-fix-off-by-one-column-wrapping-on-output.patch
|
||||
Patch22: backport-copy-copy_file_range-handle-ENOENT-for-CIFS.patch
|
||||
Patch23: backport-tail-fix-support-for-F-with-non-seekable-files.patch
|
||||
Patch24: backport-fts-fail-gracefully-when-out-of-memory.patch
|
||||
Patch25: backport-pr-fix-infinite-loop-when-double-spacing.patch
|
||||
Patch26: backport-wc-ensure-we-update-file-offset.patch
|
||||
Patch7: backport-config-color-alias-for-ls.patch
|
||||
Patch8: backport-coreutils-i18n.patch
|
||||
Patch9: backport-pr-fix-infinite-loop-when-double-spacing.patch
|
||||
|
||||
Patch9000: openEuler-coreutils-df-direct.patch
|
||||
%ifarch sw_64
|
||||
@ -166,6 +148,9 @@ fi
|
||||
%{_mandir}/man*/*
|
||||
|
||||
%changelog
|
||||
* Wed Jul 12 2023 jiangchuangang<jiangchuangang@huawei.com> - 9.3-1
|
||||
- update to 9.3
|
||||
|
||||
* Thu Jun 15 2023 jiangchuangang<jiangchuangang@huawei.com> - 9.0-10
|
||||
- sync patches from community
|
||||
- add backport-pr-fix-infinite-loop-when-double-spacing.patch
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user