diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/shuf.c | 2 | ||||
-rwxr-xr-x | tests/misc/shuf | 4 |
4 files changed, 13 insertions, 1 deletions
@@ -1,5 +1,10 @@ 2006-09-29 Jim Meyering <jim@meyering.net> + * src/shuf.c (read_input): Fix an off-by-one error that + would cause an infloop for piped input of 8KB or more. + * NEWS: Mention the fix. + * tests/misc/shuf: Test for the above fix. + Since any system may be affected by the Darwin readdir bug, perform the extra rewinddir unconditionally. The performance impact of rewinding a directory is negligible. @@ -35,6 +35,9 @@ GNU coreutils NEWS -*- outline -*- "groups" now processes options like --help more compatibly. + shuf would infloop, given 8KB or more of piped input + + * Major changes in release 6.2 (2006-09-18) [stable candidate] ** Changes in behavior diff --git a/src/shuf.c b/src/shuf.c index 39cfdfffb..68003c259 100644 --- a/src/shuf.c +++ b/src/shuf.c @@ -178,7 +178,7 @@ read_input (FILE *in, char eolbyte, char ***pline) do { - if (alloc == used) + if (alloc <= used + 1) { if (alloc == SIZE_MAX) xalloc_die (); diff --git a/tests/misc/shuf b/tests/misc/shuf index 585df9901..17a74dd3f 100755 --- a/tests/misc/shuf +++ b/tests/misc/shuf @@ -51,4 +51,8 @@ cmp in out > /dev/null && { fail=1; echo "not random?" 1>&2; } sort -n out > out1 cmp in out1 || { fail=1; echo "not a permutation" 1>&2; } +# Before coreutils-6.3, this would infloop. +# "seq 1860" produces 8193 bytes of output. +seq 1860 | shuf > /dev/null || fail=1 + (exit $fail); exit $fail |