From a38becce9752e67f71e79e8c230b327869802e70 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 29 Sep 2006 16:52:48 +0000 Subject: [PATCH] * 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. --- ChangeLog | 5 +++++ NEWS | 3 +++ src/shuf.c | 2 +- tests/misc/shuf | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index d22566f..ac1cb0e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2006-09-29 Jim Meyering + * 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. diff --git a/NEWS b/NEWS index 7d2eb9f..7a93f63 100644 --- a/NEWS +++ b/NEWS @@ -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 39cfdff..68003c2 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 585df99..17a74dd 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 -- 2.7.4