]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
csplit: avoid extraenous output files given empty input
authorPádraig Brady <P@draigBrady.com>
Thu, 9 Jan 2025 19:29:01 +0000 (19:29 +0000)
committerPádraig Brady <P@draigBrady.com>
Fri, 10 Jan 2025 14:46:48 +0000 (14:46 +0000)
* src/csplit.c (get_first_line_in_buffer): Don't exit here
upon empty input, rather indicate no input in the return
to let callers handle in a more consistent fashion.
* NEWS: Mention the bug fix.
* tests/csplit/csplit.sh: Add a test case.
Reported by Daniel Hofstetter.

NEWS
src/csplit.c
tests/csplit/csplit.sh

diff --git a/NEWS b/NEWS
index 0db68b307e6d4f6767625bafa00749b10ddb2955..db253b8ad94702385c12038b2ef6c423067f2d7a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,9 @@ GNU coreutils NEWS                                    -*- outline -*-
   cp,mv --update no longer overrides --interactive or --force.
   [bug introduced in coreutils-9.3]
 
+  csplit no longer creates empty files given empty input.
+  [This bug was present in "the beginning".]
+
   ls and printf fix shell quoted output in the edge case of escaped
   first and last characters, and single quotes in the string.
   [bug introduced in coreutils-8.26]
index c65e3d41847c66506bb58f705b8dc9cbd8d50a6e..9119dcf5a32522796bd6e4e43dc803432097cf29 100644 (file)
@@ -494,13 +494,14 @@ load_buffer (void)
     }
 }
 
-/* Return the line number of the first line that has not yet been retrieved. */
+/* Return the line number of the first line that has not yet been retrieved.
+   Return 0 if no lines available.  */
 
 static intmax_t
 get_first_line_in_buffer (void)
 {
   if (head == nullptr && !load_buffer ())
-    error (EXIT_FAILURE, errno, _("input disappeared"));
+    return 0;
 
   return head->first_available;
 }
@@ -627,7 +628,7 @@ write_to_file (intmax_t last_line, bool ignore, int argnum)
 
   first_line = get_first_line_in_buffer ();
 
-  if (first_line > last_line)
+  if (! first_line || first_line > last_line)
     {
       error (0, 0, _("%s: line number out of range"),
              quote (global_argv[argnum]));
@@ -698,7 +699,9 @@ process_line_count (const struct control *p, intmax_t repetition)
   if (no_more_lines () && suppress_matched)
     handle_line_error (p, repetition);
 
-  linenum = get_first_line_in_buffer ();
+  if (!(linenum = get_first_line_in_buffer ()))
+    handle_line_error (p, repetition);
+
   while (linenum++ < last_line_to_save)
     {
       struct cstring *line = remove_line ();
index 021b08ae243ecf73f72f127be5246538fa812a80..0b600ad8e46fc8a79ac3cffb223f41b01f049fa5 100755 (executable)
@@ -100,4 +100,14 @@ printf 'x%8199s\nx\n%8199s\nx\n' x x > in
 csplit in '/x\{1\}/' '{*}' > /dev/null || fail=1
 cat xx?? | compare - in || fail=1
 
+# Ensure file not created for empty input
+# which was the case with coreutils <= 9.5
+rm -f xx??
+csplit /dev/null 1 >/dev/null 2>err && fail=1
+test -f xx00 && fail=1
+cat <<\EOF > experr
+csplit: '1': line number out of range
+EOF
+compare experr err || fail=1
+
 Exit $fail