mirror of https://git.tukaani.org/xz.git
Scripts: Fix exit status of xzgrep.
Omit the -q option from xz, gzip, and bzip2. With xz this shouldn't matter. With gzip it's important because -q makes gzip replace SIGPIPE with exit status 2. With bzip2 it's important because with -q bzip2 is completely silent if input is corrupt while other decompressors still give an error message. Avoiding exit status 2 from gzip is important because bzip2 uses exit status 2 to indicate corrupt input. Before this commit xzgrep didn't recognize corrupt .bz2 files because xzgrep was treating exit status 2 as SIGPIPE for gzip compatibility. zstd still needs -q because otherwise it is noisy in normal operation. The code to detect real SIGPIPE didn't check if the exit status was due to a signal (>= 128) and so could ignore some other exit status too.
This commit is contained in:
parent
194029ffaf
commit
73c555b307
|
@ -156,11 +156,11 @@ res=1
|
||||||
|
|
||||||
for i; do
|
for i; do
|
||||||
case $i in
|
case $i in
|
||||||
*[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) uncompress="gzip -cdfq";;
|
*[-.][zZ] | *_z | *[-.]gz | *.t[ag]z) uncompress="gzip -cdf";;
|
||||||
*[-.]bz2 | *[-.]tbz | *.tbz2) uncompress="bzip2 -cdfq";;
|
*[-.]bz2 | *[-.]tbz | *.tbz2) uncompress="bzip2 -cdf";;
|
||||||
*[-.]lzo | *[-.]tzo) uncompress="lzop -cdfq";;
|
*[-.]lzo | *[-.]tzo) uncompress="lzop -cdf";;
|
||||||
*[-.]zst | *[-.]tzst) uncompress="zstd -cdfq";;
|
*[-.]zst | *[-.]tzst) uncompress="zstd -cdfq";; # zstd needs -q.
|
||||||
*) uncompress="$xz -cdfq";;
|
*) uncompress="$xz -cdf";;
|
||||||
esac
|
esac
|
||||||
# Fail if xz or grep (or sed) fails.
|
# Fail if xz or grep (or sed) fails.
|
||||||
xz_status=$(
|
xz_status=$(
|
||||||
|
@ -205,8 +205,14 @@ for i; do
|
||||||
# fail occurred previously, nothing worse can happen
|
# fail occurred previously, nothing worse can happen
|
||||||
test $res -gt 1 && continue
|
test $res -gt 1 && continue
|
||||||
|
|
||||||
test "$xz_status" -eq 0 || test "$xz_status" -eq 2 \
|
if test "$xz_status" -eq 0; then
|
||||||
|| test "$(kill -l "$xz_status" 2> /dev/null)" = "PIPE" || r=2
|
:
|
||||||
|
elif test "$xz_status" -ge 128 \
|
||||||
|
&& test "$(kill -l "$xz_status" 2> /dev/null)" = "PIPE"; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
r=2
|
||||||
|
fi
|
||||||
|
|
||||||
# still no match
|
# still no match
|
||||||
test $r -eq 1 && continue
|
test $r -eq 1 && continue
|
||||||
|
|
Loading…
Reference in New Issue