diff --git a/NEWS b/NEWS index d4963b275..4dad878b0 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ GNU coreutils NEWS -*- outline -*- mistakenly exit with a nonzero status. [This bug was present in "the beginning".] + 'head' and 'tail' now quote names in file headers when needed. + [This bug was present in "the beginning".] + 'pinky -l' no longer no longer prints output in the incorrect order when standard output is fully buffered, e.g., when redirected to a file. [bug introduced in coreutils-9.10] diff --git a/src/head.c b/src/head.c index e6596ecbe..96c967d8c 100644 --- a/src/head.c +++ b/src/head.c @@ -180,7 +180,7 @@ write_header (char const *filename) { static bool first_file = true; - printf ("%s==> %s <==\n", (first_file ? "" : "\n"), filename); + printf ("%s==> %s <==\n", (first_file ? "" : "\n"), quotef (filename)); first_file = false; } diff --git a/src/tail.c b/src/tail.c index 2bc29cb5d..2ca27e835 100644 --- a/src/tail.c +++ b/src/tail.c @@ -461,7 +461,7 @@ write_header (char const *prettyname) { static bool first_file = true; - printf ("%s==> %s <==\n", first_file ? "" : "\n", prettyname); + printf ("%s==> %s <==\n", first_file ? "" : "\n", quotef (prettyname)); first_file = false; } diff --git a/tests/head/quote-headers.sh b/tests/head/quote-headers.sh new file mode 100755 index 000000000..336db0e6d --- /dev/null +++ b/tests/head/quote-headers.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Ensure head quotes file names appropriately in headers +# Before coreutils 9.12 'head ...' would not quote problematic file names. + +# Copyright (C) 2026 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ head + +NL=' +' + +touch "$NL" normal || framework_failure_ + +head -n1 "$NL" normal >out || fail=1 + +cat<<\EOF>exp || framework_failure_ +==> ''$'\n' <== + +==> normal <== +EOF + +compare exp out || fail=1 + +Exit $fail diff --git a/tests/local.mk b/tests/local.mk index cc7e20a46..63a437318 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -197,6 +197,7 @@ all_tests = \ tests/tail/inotify-rotate-resources.sh \ tests/tail/inotify-dir-recreate.sh \ tests/tail/inotify-only-regular.sh \ + tests/tail/quote-headers.sh \ tests/chmod/no-x.sh \ tests/chgrp/basic.sh \ tests/rm/dangling-symlink.sh \ @@ -368,6 +369,7 @@ all_tests = \ tests/head/head-n0.sh \ tests/head/head-pos.sh \ tests/head/head-write-error.sh \ + tests/head/quote-headers.sh \ tests/misc/kill.sh \ tests/cksum/b2sum.sh \ tests/cksum/md5sum.pl \ diff --git a/tests/tail/quote-headers.sh b/tests/tail/quote-headers.sh new file mode 100755 index 000000000..2e173a144 --- /dev/null +++ b/tests/tail/quote-headers.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# Ensure tail quotes file names appropriately in headers +# Before coreutils 9.12 'tail ...' would not quote problematic file names. + +# Copyright (C) 2026 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ tail + +NL=' +' + +touch "$NL" normal || framework_failure_ + +tail -n1 "$NL" normal >out || fail=1 + +cat<<\EOF>exp || framework_failure_ +==> ''$'\n' <== + +==> normal <== +EOF + +compare exp out || fail=1 + +Exit $fail