Fix exit status of "xzdiff foo.xz bar.xz".

xzdiff was clobbering the exit status from diff in a case
statement used to analyze the exit statuses from "xz" when
its operands were two compressed files. Save and restore
diff's exit status to fix this.

The bug is inherited from zdiff in GNU gzip and was fixed
there on 2009-10-09.

Thanks to Jonathan Nieder for the patch and
to Peter Pallinger for reporting the bug.
This commit is contained in:
Lasse Collin 2011-07-31 11:01:47 +03:00
parent 324cde7a86
commit 1c673e5681
3 changed files with 59 additions and 1 deletions

View File

@ -126,10 +126,12 @@ elif test $# -eq 2; then
( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null | ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
eval "$cmp" /dev/fd/5 - >&3) 5<&0 eval "$cmp" /dev/fd/5 - >&3) 5<&0
) )
cmp_status=$?
case $xz_status in case $xz_status in
*[1-9]*) xz_status=1;; *[1-9]*) xz_status=1;;
*) xz_status=0;; *) xz_status=0;;
esac esac
(exit $cmp_status)
else else
F=`expr "/$2" : '.*/\(.*\)[-.][ablmotxz2]*$'` || F=$prog F=`expr "/$2" : '.*/\(.*\)[-.][ablmotxz2]*$'` || F=$prog
tmp= tmp=

View File

@ -10,6 +10,7 @@ EXTRA_DIST = \
tests.h \ tests.h \
test_files.sh \ test_files.sh \
test_compress.sh \ test_compress.sh \
test_scripts.sh \
bcj_test.c \ bcj_test.c \
compress_prepared_bcj_sparc \ compress_prepared_bcj_sparc \
compress_prepared_bcj_x86 compress_prepared_bcj_x86
@ -42,7 +43,8 @@ TESTS = \
test_block_header \ test_block_header \
test_index \ test_index \
test_files.sh \ test_files.sh \
test_compress.sh test_compress.sh \
test_scripts.sh
clean-local: clean-local:
-rm -f compress_generated_* -rm -f compress_generated_*

54
tests/test_scripts.sh Executable file
View File

@ -0,0 +1,54 @@
#!/bin/sh
###############################################################################
#
# Author: Jonathan Nieder
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
###############################################################################
# If scripts weren't built, this test is skipped.
XZ=../src/xz/xz
XZDIFF=../src/scripts/xzdiff
test -x "$XZ" || XZ=
test -r "$XZDIFF" || XZDIFF=
if test -z "$XZ" || test -z "$XZDIFF"; then
(exit 77)
exit 77
fi
PATH=`pwd`/../src/xz:$PATH
export PATH
preimage=$srcdir/files/good-1-check-crc32.xz
samepostimage=$srcdir/files/good-1-check-crc64.xz
otherpostimage=$srcdir/files/good-1-lzma2-1.xz
sh "$XZDIFF" "$preimage" "$samepostimage" >/dev/null
status=$?
if test "$status" != 0 ; then
echo "xzdiff with no changes exited with status $status != 0"
(exit 1)
exit 1
fi
sh "$XZDIFF" "$preimage" "$otherpostimage" >/dev/null
status=$?
if test "$status" != 1 ; then
echo "xzdiff with changes exited with status $status != 1"
(exit 1)
exit 1
fi
sh "$XZDIFF" "$preimage" "$srcdir/files/missing.xz" >/dev/null 2>&1
status=$?
if test "$status" != 2 ; then
echo "xzdiff with missing operand exited with status $status != 2"
(exit 1)
exit 1
fi
(exit 0)
exit 0