gzip/bsc1198062-2.patch
2024-02-07 23:17:56 +08:00

160 lines
5.4 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 9d3248751178939713a39115cf68ec8a11506cc9 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 5 Apr 2022 15:16:33 -0700
Subject: [PATCH 7/7] zgrep: fix "binary file matches" mislabeling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Problem reported by Jim Avera (Bug#31280).
This became more of an issue when GNU grep 3.5 (2020) started sending
"binary file matches" diagnostics to stderr instead of to stdout.
* tests/Makefile.am (TESTS): Add zgrep-binary.
* tests/zgrep-binary: New test.
* zgrep.in (args): New var, to accumulate args separately
from grep command, so we can prepend args if need be.
Most uses of 'grep' changed to use 'args' instead, or also.
(with_filename): Set to 1 if more than one file and -h not given;
this simplifies later code.
(gnuish_grep): New var; evaluates to true if grep supports
-H and --label options, as is true for GNU and FreeBSD grep.
Append -H to 'grep' if outputting file names with GNUish grep,
and use --label with GNUish grep unless reading from stdin,
as thats safer and more efficient than relabeling with 'sed'.
---
NEWS | 3 +++
tests/Makefile.am | 1 +
tests/zgrep-binary | 30 ++++++++++++++++++++++++++++++
zgrep.in | 28 +++++++++++++++++++---------
4 files changed, 53 insertions(+), 9 deletions(-)
create mode 100755 tests/zgrep-binary
Index: gzip-1.10/tests/Makefile.am
===================================================================
--- gzip-1.10.orig/tests/Makefile.am
+++ gzip-1.10/tests/Makefile.am
@@ -35,6 +35,7 @@ TESTS = \
zdiff \
zgrep-f \
zgrep-abuse \
+ zgrep-binary \
zgrep-context \
zgrep-signal \
znew-k
Index: gzip-1.10/tests/zgrep-binary
===================================================================
--- /dev/null
+++ gzip-1.10/tests/zgrep-binary
@@ -0,0 +1,30 @@
+#!/bin/sh
+# 'zgrep PATTERN FILE' would output "(standard input): binary file matches"
+# without mentioning FILE. Fixed in gzip-1.12.
+
+# Copyright (C) 2022 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 <https://www.gnu.org/licenses/>.
+# limit so don't run it by default.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ..
+
+fail=0
+
+unset GREP_OPTIONS
+
+printf 'foo\0\n' >f || framework_failure_
+LC_ALL=C zgrep foo f >out 2>err && grep '(standard input)' out err && fail=1
+
+Exit $fail
Index: gzip-1.10/zgrep.in
===================================================================
--- gzip-1.10.orig/zgrep.in
+++ gzip-1.10/zgrep.in
@@ -23,6 +23,7 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
grep='${GREP-'\''@GREP@'\''}'
+args=
version='zgrep (gzip) @VERSION@
Copyright (C) 2010-2018 Free Software Foundation, Inc.
@@ -178,7 +179,7 @@ while test $# -ne 0; do
option="'$option'";;
esac
- grep="$grep $option$optarg"
+ args="$args $option$optarg"
done
eval "set -- $operands "'${1+"$@"}'
@@ -186,15 +187,23 @@ eval "set -- $operands "'${1+"$@"}'
if test $have_pat -eq 0; then
case ${1?"missing pattern; try \`$0 --help' for help"} in
(*\'*)
- grep="$grep -- '"$(printf '%s\n' "$1" | LC_ALL=C sed "$escape");;
+ args="$args -- '"$(printf '%s\n' "$1" | LC_ALL=C sed "$escape");;
(*)
- grep="$grep -- '$1'";;
+ args="$args -- '$1'";;
esac
shift
fi
if test $# -eq 0; then
set -- -
+elif test 1 -lt $# && test $no_filename -eq 0; then
+ with_filename=1
+fi
+
+l_e=$(eval "(echo e | $grep -H --label=l e) 2>/dev/null") && test "$l_e" = l:e
+gnuish_grep="test $? -eq 0"
+if $gnuish_grep && test $with_filename -eq 1; then
+ grep="$grep -H"
fi
exec 3>&1
@@ -221,9 +230,9 @@ do
exec 5>&1
($uncompress -cdfq -- "$i" 5>&-; echo $? >&5) 3>&- |
if test $files_with_matches -eq 1; then
- eval "$grep" >/dev/null && { printf '%s\n' "$i" || exit 2; }
+ eval "$grep$args" >/dev/null && { printf '%s\n' "$i" || exit 2; }
elif test $files_without_matches -eq 1; then
- eval "$grep" >/dev/null || {
+ eval "$grep$args" >/dev/null || {
r=$?
if test $r -eq 1; then
printf '%s\n' "$i" || r=2
@@ -231,9 +240,10 @@ do
test 256 -le $r && r=$(expr 128 + $r % 128)
exit $r
}
- elif test $with_filename -eq 0 &&
- { test $# -eq 1 || test $no_filename -eq 1; }; then
- eval "$grep"
+ elif $gnuish_grep && test "$i" != -; then
+ eval "$grep --label \"\$i\"$args"
+ elif $gnuish_grep || test $with_filename -eq 0; then
+ eval "$grep$args"
else
case $i in
(*'
@@ -247,7 +257,7 @@ do
# Fail if grep or sed fails.
r=$(
exec 4>&1
- (eval "$grep" 4>&-; echo $? >&4) 3>&- |
+ (eval "$grep$args" 4>&-; echo $? >&4) 3>&- |
LC_ALL=C sed "$sed_script" >&3 4>&-
) || { r=$?; test $r -lt 2 && r=2; }
test 256 -le $r && r=$(expr 128 + $r % 128)