From: Pádraig Brady
Date: Wed, 22 Oct 2025 15:11:53 +0000 (+0100) Subject: fmt: promptly diagnose write errors X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c12a2ecb53e9c141e705a2e4645de5201237a1f6;p=thirdparty%2Fcoreutils.git fmt: promptly diagnose write errors * NEWS: Mention the improvement. * src/fmt.c (put_line): Exit if any error writing line. (flush_paragraph): Exit if any error writing buffer. * tests/misc/write-errors.sh: Enable the (flush_paragraph) test case, and add another to check the put_line() case. --- diff --git a/NEWS b/NEWS index b49b73c547..55fe59503e 100644 --- a/NEWS +++ b/NEWS @@ -43,6 +43,9 @@ GNU coreutils NEWS -*- outline -*- ** Improvements + 'fmt' will now exit promptly upon receiving a write error, + which is significant when reading large / unbounded inputs. + 'install' now uses posix_spawn() to invoke the strip program more efficiently. 'numfmt': diff --git a/src/fmt.c b/src/fmt.c index 244a8a5c92..7a02205a84 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -810,7 +810,10 @@ flush_paragraph (void) if (word_limit == word) { - fwrite (parabuf, sizeof *parabuf, wptr - parabuf, stdout); + size_t to_write = wptr - parabuf; + if (fwrite (parabuf, 1, to_write, stdout) != to_write) + write_error (); + wptr = parabuf; return; } @@ -1010,6 +1013,9 @@ put_line (WORD *w, int indent) put_word (w); last_line_length = out_column; putchar ('\n'); + + if (ferror (stdout)) + write_error (); } /* Output to stdout the word W. */ diff --git a/tests/misc/write-errors.sh b/tests/misc/write-errors.sh index 782ccae5a7..48f9c0f1a8 100755 --- a/tests/misc/write-errors.sh +++ b/tests/misc/write-errors.sh @@ -33,7 +33,8 @@ cut -z -f1- /dev/zero dd if=/dev/zero expand /dev/zero factor --version; yes 1 | factor -# TODO: fmt /dev/zero +fmt /dev/zero +fmt --version; yes | fmt fold /dev/zero fold -b /dev/zero fold -c /dev/zero