gzip/zdiff-fix-another-arg-handling-bug.patch
weiwei_tiantian 65feba82ae backport fix patches from upstream and fix build failure in OBS
(cherry picked from commit 43725f660564fa21667a106f5aae9e35738a0e34)
2022-04-02 10:57:27 +08:00

201 lines
6.0 KiB
Diff

From 78b29bdde523b72748049f3cf05698b9dabf52ae Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Tue, 8 Mar 2022 13:02:37 -0800
Subject: [PATCH 2/2] zdiff: fix another arg-handling bug
Also allow args after file names.
Problem reported by Lv Ying <https://bugs.gnu.org/54290#12>.
---
zdiff.in | 127 ++++++++++++++++++++++++++++++++-----------------------
1 file changed, 75 insertions(+), 52 deletions(-)
diff --git a/zdiff.in b/zdiff.in
index d982d9f..593cb6e 100644
--- a/zdiff.in
+++ b/zdiff.in
@@ -48,60 +48,85 @@ escape='
$s/X$/'\''/
'
-while :; do
- argdone=:
- case $1 in
+filesonly=
+file1=
+file2=
+needop=
+
+for arg
+do
+ case $filesonly$needop$arg in
--h*) printf '%s\n' "$usage" || exit 2; exit;;
--v*) printf '%s\n' "$version" || exit 2; exit;;
- --) shift; break;;
- -*\'*) argdone=false arg=$1;;
- -[CDFISUWXx])
- cmp="$cmp $1"
- case ${2?} in
- -*\'*) argdone=false arg=$2;;
- *) cmp="$cmp '$2'";;
- esac
- shift;;
- -?*) cmp="$cmp '$1'";;
- *) break;;
+ --) filesonly=t;;
+ -*\'*) cmp="$cmp '"`printf '%sX\n' "$arg" | sed "$escape"`;;
+ -[CDFISUWXx]) needop="'$arg'";;
+ -?*) cmp="$cmp '$arg'";;
+ *) case $needop in
+ '') case $arg in
+ '') printf >&2 '%s\n' "$0: empty file name"; exit 2;;
+ esac
+ case $file1 in
+ '') file1=$arg;;
+ *) case $file2 in
+ '') file2=$arg;;
+ *) printf >&2 '%s\n' "$0: extra operand '$arg'"; exit 2;;
+ esac;;
+ esac;;
+ *) cmp="$cmp $needop '$arg'"
+ needop=;;
+ esac;;
esac
- $argdone || cmp="$cmp '"`printf '%sX\n' "$arg" | sed "$escape"`
- shift
done
+case $needop in
+'') ;;
+*) printf >&2 '%s\n' "$0: $prevarg: option requires an argument -- $needop"
+ exit 2;;
+esac
+
cmp="$cmp --"
-for file
-do
- test "X$file" = X- || <"$file" || exit 2
-done
+case $file1 in
+'') printf >&2 '%s\n' "$0: missing operand"; exit 2;;
+-) ;;
+*) <"$file1" || exit 2;;
+esac
+case $file2 in
+''|-) ;;
+*) <"$file2" || exit 2;;
+esac
gzip_status=0
exec 3>&1
-if test $# -eq 1; then
- case $1 in
+case $file2 in
+'')
+ case $file1 in
*[-.]gz* | *[-.][zZ] | *.t[ga]z)
- FILE=`expr "X$1" : 'X\(.*\)[-.][zZtga]*$'`
+ FILE=`expr "X$file1" : 'X\(.*\)[-.][zZtga]*$'`
gzip_status=$(
exec 4>&1
- (gzip -cd -- "$1" 4>&-; echo $? >&4) 3>&- | eval "$cmp" - '"$FILE"' >&3
+ (gzip -cd -- "$file1" 4>&-; echo $? >&4) 3>&- |
+ eval "$cmp" - '"$FILE"' >&3
);;
*)
- printf >&2 '%s\n' "$0: $1: unknown compressed file extension"
+ printf >&2 '%s\n' "$0: $file1: unknown compressed file extension"
exit 2;;
- esac
-elif test $# -eq 2; then
- case "$1" in
+ esac;;
+*)
+ case $file1,$file2 in
+ -,-)
+ gzip_status=$(
+ exec 4>&1
+ (gzip -cdfq - 4>&-; echo $? >&4) 3>&- |
+ eval "$cmp" - - >&3
+ );;
+ *)
+ case $file1 in
*[-.]gz* | *[-.][zZ] | *.t[ga]z | -)
- case "$2" in
+ case $file2 in
*[-.]gz* | *[-.][zZ] | *.t[ga]z | -)
- if test "$1$2" = --; then
- gzip_status=$(
- exec 4>&1
- (gzip -cdfq - 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" - - >&3
- )
- elif
+ if
# Reject Solaris 8's buggy /bin/bash 2.03.
echo X |
(echo X | eval "$cmp" /dev/fd/5 - >/dev/null 2>&1) \
@@ -109,8 +134,9 @@ elif test $# -eq 2; then
then
gzip_status=$(
exec 4>&1
- (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
- ( (gzip -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
+ (gzip -cdfq -- "$file1" 4>&-; echo $? >&4) 3>&- |
+ ((gzip -cdfq -- "$file2" 4>&-
+ echo $? >&4) 3>&- 5<&- </dev/null |
eval "$cmp" /dev/fd/5 - >&3) 5<&0
)
cmp_status=$?
@@ -137,10 +163,10 @@ elif test $# -eq 2; then
set -C
tmp=${TMPDIR}zdiff$$
fi
- gzip -cdfq -- "$2" > "$tmp" || exit 2
+ gzip -cdfq -- "$file2" > "$tmp" || exit 2
gzip_status=$(
exec 4>&1
- (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
+ (gzip -cdfq -- "$file1" 4>&-; echo $? >&4) 3>&- |
eval "$cmp" - '"$tmp"' >&3
)
cmp_status=$?
@@ -151,25 +177,22 @@ elif test $# -eq 2; then
*)
gzip_status=$(
exec 4>&1
- (gzip -cdfq -- "$1" 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" - '"$2"' >&3
+ (gzip -cdfq -- "$file1" 4>&-; echo $? >&4) 3>&- |
+ eval "$cmp" - '"$file2"' >&3
);;
esac;;
- *) case "$2" in
+ *) case $file2 in
*[-.]gz* | *[-.][zZ] | *.t[ga]z | -)
gzip_status=$(
exec 4>&1
- (gzip -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- |
- eval "$cmp" '"$1"' - >&3
+ (gzip -cdfq -- "$file2" 4>&-; echo $? >&4) 3>&- |
+ eval "$cmp" '"$file1"' - >&3
);;
- *) eval "$cmp" '"$1"' '"$2"';;
+ *) eval "$cmp" '"$file1"' '"$file2"';;
esac;;
- esac
-else
- printf >&2 '%s\n' \
- "$0: invalid number of operands; try \`$0 --help' for help"
- exit 2
-fi
+ esac;;
+ esac;;
+esac
cmp_status=$?
test "$gzip_status" -eq 0 || exit 2
--
2.27.0