diff options
-rw-r--r-- | src/shuf.c | 6 | ||||
-rwxr-xr-x | tests/misc/shuf.sh | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/src/shuf.c b/src/shuf.c index bbf3a86c2..0fabb0bfe 100644 --- a/src/shuf.c +++ b/src/shuf.c @@ -463,7 +463,8 @@ main (int argc, char **argv) break; case 1: - if (! (STREQ (operand[0], "-") || freopen (operand[0], "r", stdin))) + if (! (STREQ (operand[0], "-") || ! head_lines + || freopen (operand[0], "r", stdin))) error (EXIT_FAILURE, errno, "%s", operand[0]); break; @@ -474,7 +475,8 @@ main (int argc, char **argv) fadvise (stdin, FADVISE_SEQUENTIAL); - if (head_lines != SIZE_MAX && input_size () > RESERVOIR_MIN_INPUT) + if (head_lines != SIZE_MAX && (! head_lines + || input_size () > RESERVOIR_MIN_INPUT)) { use_reservoir_sampling = true; n_lines = SIZE_MAX; /* unknown number of input lines, for now. */ diff --git a/tests/misc/shuf.sh b/tests/misc/shuf.sh index 9c9526d4d..171b25a1f 100755 --- a/tests/misc/shuf.sh +++ b/tests/misc/shuf.sh @@ -57,4 +57,10 @@ cmp out exp || { fail=1; echo "missing NUL terminator?" 1>&2; } timeout 10 shuf -i1-$SIZE_MAX -n2 >/dev/null || { fail=1; echo "couldn't get a small subset" >&2; } +# Ensure shuf -n0 doesn't read any input or open specified files +touch unreadable || framework_failure_ +chmod 0 unreadable || framework_failure_ +shuf -n0 unreadable || fail=1 +shuf -n1 unreadable && fail=1 + Exit $fail |