summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2014-02-23 15:34:48 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2014-02-23 15:35:27 -0800
commit9f60f37a28c37acb66aa38003ccaa07f13abbd9d (patch)
treeb7fb5360fe4b32fe3ac4cbb6b6f2ca80543822cd
parent85c925ef54348d795e3549d7b01ceb2d57096a50 (diff)
downloadcoreutils-9f60f37a28c37acb66aa38003ccaa07f13abbd9d.tar.xz
shuf: with -r, don't dump core if the input is empty
Problem reported by valiant xiao in <http://bugs.gnu.org/16855>. * NEWS: Document this. * src/shuf.c (main): With -r, report an error if the input is empty. * tests/misc/shuf.sh: Test for the bug.
-rw-r--r--NEWS3
-rw-r--r--src/shuf.c15
-rwxr-xr-xtests/misc/shuf.sh4
3 files changed, 18 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index e72942b10..2df246d49 100644
--- a/NEWS
+++ b/NEWS
@@ -22,6 +22,9 @@ GNU coreutils NEWS -*- outline -*-
it would display an error, requiring --no-dereference to avoid the issue.
[bug introduced in coreutils-5.3.0]
+ shuf -r no longer dumps core if the input is empty.
+ [bug introduced in coreutils-8.22]
+
** New features
od accepts a new option: --endian=TYPE to handle inputs with different byte
diff --git a/src/shuf.c b/src/shuf.c
index d4641fe19..2a910728e 100644
--- a/src/shuf.c
+++ b/src/shuf.c
@@ -576,11 +576,18 @@ main (int argc, char **argv)
/* Generate output according to requested method */
if (repeat)
{
- if (input_range)
- i = write_random_numbers (randint_source, head_lines,
- lo_input, hi_input, eolbyte);
+ if (head_lines == 0)
+ i = 0;
else
- i = write_random_lines (randint_source, head_lines, line, n_lines);
+ {
+ if (n_lines == 0)
+ error (EXIT_FAILURE, 0, _("No lines to repeat"));
+ if (input_range)
+ i = write_random_numbers (randint_source, head_lines,
+ lo_input, hi_input, eolbyte);
+ else
+ i = write_random_lines (randint_source, head_lines, line, n_lines);
+ }
}
else
{
diff --git a/tests/misc/shuf.sh b/tests/misc/shuf.sh
index d3ea1f2ee..d7251d1d6 100755
--- a/tests/misc/shuf.sh
+++ b/tests/misc/shuf.sh
@@ -43,6 +43,10 @@ compare in out1 || { fail=1; echo "not a permutation" 1>&2; }
t=$(shuf -e a b c d e | sort | fmt)
test "$t" = 'a b c d e' || { fail=1; echo "not a permutation" 1>&2; }
+# coreutils-8.22 dumps core.
+shuf -er
+test $? -eq 1 || fail=1
+
# Before coreutils-6.3, this would infloop.
# "seq 1860" produces 8193 (8K + 1) bytes of output.
seq 1860 | shuf > /dev/null || fail=1