From: Paul Eggert Date: Thu, 23 Dec 2010 08:07:35 +0000 (-0800) Subject: csplit: diagnose file counter wraparound X-Git-Tag: v8.9~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bc4e77927c6610d856bec90a60da931e33d3abbb;p=thirdparty%2Fcoreutils.git csplit: diagnose file counter wraparound * src/csplit.c (create_output_file): Detect overflow when the file counter wraps around, and exit with a diagnostic. Formerly the code silently wrapped around and wrote to the wrong file, losing output data. --- diff --git a/src/csplit.c b/src/csplit.c index 07c5c8c572..9629750c96 100644 --- a/src/csplit.c +++ b/src/csplit.c @@ -917,19 +917,27 @@ make_filename (unsigned int num) static void create_output_file (void) { - sigset_t oldset; bool fopen_ok; int fopen_errno; output_filename = make_filename (files_created); - /* Create the output file in a critical section, to avoid races. */ - sigprocmask (SIG_BLOCK, &caught_signals, &oldset); - output_stream = fopen (output_filename, "w"); - fopen_ok = (output_stream != NULL); - fopen_errno = errno; - files_created += fopen_ok; - sigprocmask (SIG_SETMASK, &oldset, NULL); + if (files_created == UINT_MAX) + { + fopen_ok = false; + fopen_errno = EOVERFLOW; + } + else + { + /* Create the output file in a critical section, to avoid races. */ + sigset_t oldset; + sigprocmask (SIG_BLOCK, &caught_signals, &oldset); + output_stream = fopen (output_filename, "w"); + fopen_ok = (output_stream != NULL); + fopen_errno = errno; + files_created += fopen_ok; + sigprocmask (SIG_SETMASK, &oldset, NULL); + } if (! fopen_ok) {