1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-02-13 02:42:18 +02:00

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.
This commit is contained in:
Pádraig Brady
2016-11-28 17:11:18 +00:00
parent d8104265f2
commit 0655b86a6e
2 changed files with 6 additions and 2 deletions

4
NEWS
View File

@@ -25,6 +25,10 @@ GNU coreutils NEWS -*- outline -*-
factor again outputs immediately when numbers are input interactively.
[bug introduced in coreutils-8.24]
head no longer tries to process non-seekable input as seekable,
which resulted in failures on FreeBSD 11 at least.
[bug introduced in coreutils-8.24]
install -DZ and mkdir -pZ now set default SELinux context correctly even if
two or more directories nested in each other are created and each of them
defaults to a different SELinux context.

View File

@@ -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
{