aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2025-01-09 19:29:01 +0000
committerPádraig Brady <P@draigBrady.com>2025-01-10 14:46:48 +0000
commit8482cb94512b1b801abc69349a6ba1c977324662 (patch)
treec7e802f70430cc8bbefd2ddf8834429dc53a3bd7
parentls: suppress "Permission denied" errors on NFS (diff)
downloadcoreutils-8482cb94512b1b801abc69349a6ba1c977324662.tar.gz
coreutils-8482cb94512b1b801abc69349a6ba1c977324662.zip
csplit: avoid extraenous output files given empty input
* 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.
-rw-r--r--NEWS3
-rw-r--r--src/csplit.c11
-rwxr-xr-xtests/csplit/csplit.sh10
3 files changed, 20 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 0db68b307..db253b8ad 100644
--- 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]
diff --git a/src/csplit.c b/src/csplit.c
index c65e3d418..9119dcf5a 100644
--- a/src/csplit.c
+++ b/src/csplit.c
@@ -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 ();
diff --git a/tests/csplit/csplit.sh b/tests/csplit/csplit.sh
index 021b08ae2..0b600ad8e 100755
--- a/tests/csplit/csplit.sh
+++ b/tests/csplit/csplit.sh
@@ -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