From 3621ad2f71efeeefa5801707e49e319b84c4672c Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Fri, 9 Jan 2026 21:17:26 -0800 Subject: [PATCH] cksum: promptly diagnose write errors * src/cksum.c (output_file, digest_check): Check if standard output has it's error flag set after printing. * tests/misc/write-errors.sh: Add a test case that would previously run forever. * NEWS: Mention the improvement. Reorder alphabetically. --- NEWS | 6 +++--- src/cksum.c | 6 ++++++ tests/misc/write-errors.sh | 3 +++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 63db27dee..7bd3c9b34 100644 --- a/NEWS +++ b/NEWS @@ -73,14 +73,14 @@ GNU coreutils NEWS -*- outline -*- 'cksum' now validates its options more consistently. E.g., `cksum --text --tag` now fails like `cksum --tag --text` already did. + 'cksum', 'du', and 'wc' now exit promptly upon receiving a write + error, which is significant when processing many input files. + csplit, ls, and sort, now handle a more complete set of terminating signals. 'du' now processes directories with 10,000 or more entries up to 9 times faster on the Lustre file system. - 'du', and 'wc' now exit promptly upon receiving a write error, - which is significant when processing many input files. - 'pinky' will now exit immediately upon receiving a write error, which is significant when reading large plan or project files. diff --git a/src/cksum.c b/src/cksum.c index 2c5cdfbe1..7d6ff982b 100644 --- a/src/cksum.c +++ b/src/cksum.c @@ -1266,6 +1266,9 @@ output_file (char const *file, int binary_file, void const *digest, } putchar (delim); + + if (ferror (stdout)) + write_error (); } #endif @@ -1447,6 +1450,9 @@ digest_check (char const *checkfile_name) printf (": %s\n", _("OK")); } } + + if (ferror (stdout)) + write_error (); } } while (!feof (checkfile_stream) && !ferror (checkfile_stream)); diff --git a/tests/misc/write-errors.sh b/tests/misc/write-errors.sh index e335e52d6..3773dda39 100755 --- a/tests/misc/write-errors.sh +++ b/tests/misc/write-errors.sh @@ -24,11 +24,14 @@ if ! test -w /dev/full || ! test -c /dev/full; then skip_ '/dev/full is required' fi +dev_null_hash=$(cksum -a sha3 -l 256 /dev/null) || framework_failure_ + # Writers that may output data indefinitely. # First word in command line is checked against built programs. # Escapes must be double escaped. printf '%s' "\ cat /dev/zero +cksum --version; yes '${dev_null_hash}' | cksum --check comm -z /dev/zero /dev/zero cut -z -c1- /dev/zero cut -z -f1- /dev/zero