From: Pádraig Brady Date: Mon, 25 May 2026 14:56:34 +0000 (+0100) Subject: head,tail: quote name in file headers appropriately X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fdcfb10873f944b6ac0fb07a3220295c21f6ea85;p=thirdparty%2Fcoreutils.git head,tail: quote name in file headers appropriately * src/tail.c (write_header): Use quotef() to quote file names when needed. * src/head.c (write_header): Likewise. * tests/head/quote-headers.sh: Add a new test. * tests/tail/quote-headers.sh: Add a new test. * tests/local.mk: Reference the new test. Reported by Michał Majchrowicz. --- diff --git a/NEWS b/NEWS index d4963b2758..4dad878b03 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 e6596ecbe1..96c967d8cd 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 2bc29cb5de..2ca27e8350 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 0000000000..336db0e6d7 --- /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 cc7e20a466..63a4373186 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 0000000000..2e173a1441 --- /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