From bdc47235659b15fbd99416c4ec9b6991e49e057d Mon Sep 17 00:00:00 2001 From: ash Date: Sat, 1 Nov 2025 13:38:14 +0000 Subject: [PATCH] coreutils: patch `tail` printing too few lines * https://lists.gnu.org/archive/html/coreutils/2025-09/msg00233.html * https://github.com/coreutils/coreutils/commit/914972e80dbf82aac9ffe3ff1f67f1028e1a788b * https://github.com/NixOS/nixpkgs/pull/445644#issuecomment-3467852989. --- pkgs/tools/misc/coreutils/default.nix | 6 ++++ pkgs/tools/misc/coreutils/tail.patch | 50 +++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 pkgs/tools/misc/coreutils/tail.patch diff --git a/pkgs/tools/misc/coreutils/default.nix b/pkgs/tools/misc/coreutils/default.nix index 4f94c41dcf42..dd7c095900ca 100644 --- a/pkgs/tools/misc/coreutils/default.nix +++ b/pkgs/tools/misc/coreutils/default.nix @@ -55,6 +55,12 @@ stdenv.mkDerivation rec { hash = "sha256-5tT9LYUskUGhwqGKE9FGoM1+RRlfcik6TkwETsbMyhU="; }; + patches = [ + # Extremely bad bug where `tail` prints fewer lines than it should. + # https://github.com/coreutils/coreutils/commit/914972e80dbf82aac9ffe3ff1f67f1028e1a788b + ./tail.patch + ]; + postPatch = '' # The test tends to fail on btrfs, f2fs and maybe other unusual filesystems. sed '2i echo Skipping dd sparse test && exit 77' -i ./tests/dd/sparse.sh diff --git a/pkgs/tools/misc/coreutils/tail.patch b/pkgs/tools/misc/coreutils/tail.patch new file mode 100644 index 000000000000..40336daae137 --- /dev/null +++ b/pkgs/tools/misc/coreutils/tail.patch @@ -0,0 +1,50 @@ +(NB: we omit the new test, in order to avoid rerunning autoconf.) + +From 914972e80dbf82aac9ffe3ff1f67f1028e1a788b Mon Sep 17 00:00:00 2001 +From: Hannes Braun +Date: Wed, 24 Sep 2025 21:20:49 +0200 +Subject: [PATCH] tail: fix tailing larger number of lines in regular files + +* src/tail.c (file_lines): Seek to the previous block instead of the +beginning (or a little before) of the block that was just scanned. +Otherwise, the same block is read and scanned (at least partially) +again. This bug was introduced by commit v9.7-219-g976f8abc1. +* tests/tail/basic-seek.sh: Add a new test. +* tests/local.mk: Reference the new test. +* NEWS: mention the bug fix. +--- + NEWS | 4 ++++ + src/tail.c | 2 +- + tests/local.mk | 1 + + tests/tail/basic-seek.sh | 28 ++++++++++++++++++++++++++++ + 4 files changed, 34 insertions(+), 1 deletion(-) + create mode 100755 tests/tail/basic-seek.sh + +diff --git a/NEWS b/NEWS +index 7a1a73113e839f010aa6c734e6f07da68827b953..dc1d26879327761d35499815776477771758edd4 100644 +--- a/NEWS ++++ b/NEWS +@@ -7,6 +7,10 @@ GNU coreutils NEWS -*- outline -*- + `basenc --base58` would not operate correctly with input > 15561475 bytes. + [bug introduced with --base58 in coreutils-9.8] + ++ 'tail' outputs the correct number of lines again for non-small -n values. ++ Previously it may have output too few lines. ++ [bug introduced in coreutils-9.8] ++ + + * Noteworthy changes in release 9.8 (2025-09-22) [stable] + +diff --git a/src/tail.c b/src/tail.c +index b8bef1d91cdb6cde2b666b6c1575376e075eaeb8..c7779c77dfe4cf5a672a265b6e796c7153590170 100644 +--- a/src/tail.c ++++ b/src/tail.c +@@ -596,7 +596,7 @@ file_lines (char const *prettyname, int fd, struct stat const *sb, + goto free_buffer; + } + +- pos = xlseek (fd, -bufsize, SEEK_CUR, prettyname); ++ pos = xlseek (fd, -(bufsize + bytes_read), SEEK_CUR, prettyname); + bytes_read = read (fd, buffer, bufsize); + if (bytes_read < 0) + {