From bc4e77927c6610d856bec90a60da931e33d3abbb Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 23 Dec 2010 00:07:35 -0800 Subject: 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. --- src/csplit.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/csplit.c b/src/csplit.c index 07c5c8c57..9629750c9 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) { -- cgit v1.2.3-54-g00ecf