diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-02-23 15:34:48 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-02-23 15:35:27 -0800 |
commit | 9f60f37a28c37acb66aa38003ccaa07f13abbd9d (patch) | |
tree | b7fb5360fe4b32fe3ac4cbb6b6f2ca80543822cd | |
parent | 85c925ef54348d795e3549d7b01ceb2d57096a50 (diff) | |
download | coreutils-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-- | NEWS | 3 | ||||
-rw-r--r-- | src/shuf.c | 15 | ||||
-rwxr-xr-x | tests/misc/shuf.sh | 4 |
3 files changed, 18 insertions, 4 deletions
@@ -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 |