diff options
author | Pádraig Brady <P@draigBrady.com> | 2016-11-28 17:11:18 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2016-11-28 18:36:32 +0000 |
commit | 0655b86a6ebc6f1324810d504a71803aa708d162 (patch) | |
tree | 457a99f6d50d5c5f8b4a0ce13b6394503914f260 /src | |
parent | d8104265f229ababd5a68a46eeccbccc07e72cdc (diff) | |
download | coreutils-0655b86a6ebc6f1324810d504a71803aa708d162.tar.xz |
head: fix processing of non-seekable input as seekable
* src/head.c (elide_tail_bytes_file): Ensure we don't use
st_size unless we've previously used seek() to determine
the CURRENT_POS in the seekable file.
This was seen to cause issue on FreeBSD 11 when the pipe
buffer was filled with `yes | head --lines=-0`, in which
case st_size was 64KiB while ST_BLKSIZE() was 4KiB.
Reported by Assaf Gordon.
Diffstat (limited to 'src')
-rw-r--r-- | src/head.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/head.c b/src/head.c index 21ace70b4..756c978c6 100644 --- a/src/head.c +++ b/src/head.c @@ -465,7 +465,7 @@ elide_tail_bytes_file (const char *filename, int fd, uintmax_t n_elide, struct stat const *st, off_t current_pos) { off_t size = st->st_size; - if (presume_input_pipe || size <= ST_BLKSIZE (*st)) + if (presume_input_pipe || current_pos < 0 || size <= ST_BLKSIZE (*st)) return elide_tail_bytes_pipe (filename, fd, n_elide, current_pos); else { @@ -754,7 +754,7 @@ elide_tail_lines_file (const char *filename, int fd, uintmax_t n_elide, struct stat const *st, off_t current_pos) { off_t size = st->st_size; - if (presume_input_pipe || size <= ST_BLKSIZE (*st)) + if (presume_input_pipe || current_pos < 0 || size <= ST_BLKSIZE (*st)) return elide_tail_lines_pipe (filename, fd, n_elide, current_pos); else { |