diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-03-31 10:21:58 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-03-31 10:24:07 -0700 |
commit | d08381bc261d95502a205f7214686f80383c9692 (patch) | |
tree | 7cb9c052f70fe75fe4474233a6ca500afacc871b | |
parent | 2d8ae88a228ac82c725f22aaee24accde8a12dcf (diff) | |
download | coreutils-d08381bc261d95502a205f7214686f80383c9692.tar.xz |
head: fix bug with head -c-N when stdin is not at start
* src/head.c (elide_tail_bytes_file): Fix typo in lseek invocation.
* tests/misc/head-c.sh: Add test for this bug.
* NEWS: Document this.
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | src/head.c | 2 | ||||
-rwxr-xr-x | tests/misc/head-c.sh | 8 |
3 files changed, 13 insertions, 1 deletions
@@ -20,6 +20,10 @@ GNU coreutils NEWS -*- outline -*- date could crash or go into an infinite loop when parsing a malformed TZ="". [bug introduced with the --date='TZ="" ..' parsing feature in coreutils-5.3.0] + head --bytes=-N - no longer fails with a bogus diagnostic when stdin's + seek pointer is not at the beginning. + [bug introduced with the --bytes=-N feature in coreutils-5.0.1] + head --lines=-0, when the input does not contain a trailing '\n', now copies all input to stdout. Previously nothing was output in this case. [bug introduced with the --lines=-N feature in coreutils-5.0.1] diff --git a/src/head.c b/src/head.c index b833af675..e27ce4618 100644 --- a/src/head.c +++ b/src/head.c @@ -443,7 +443,7 @@ elide_tail_bytes_file (const char *filename, int fd, uintmax_t n_elide) /* Seek back to 'current' position, then copy the required number of bytes from fd. */ - if (lseek (fd, 0, current_pos) == -1) + if (lseek (fd, current_pos, SEEK_SET) < 0) { error (0, errno, _("%s: cannot lseek back to original position"), quote (filename)); diff --git a/tests/misc/head-c.sh b/tests/misc/head-c.sh index 00d5f6018..d6433d0dd 100755 --- a/tests/misc/head-c.sh +++ b/tests/misc/head-c.sh @@ -29,6 +29,14 @@ case "$(cat out)" in *) fail=1 ;; esac +# Test for a bug in coreutils 5.0.1 through 8.22. +printf 'abc\ndef\n' > in1 || framework_failure_ +(dd bs=1 skip=1 count=0 status=none && head -c-4) < in1 > out1 || fail=1 +case "$(cat out1)" in + bc) ;; + *) fail=1 ;; +esac + # Only allocate memory as needed. # Coreutils <= 8.21 would allocate memory up front # based on the value passed to -c |