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:
4
NEWS
4
NEWS
@@ -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.
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user