bzcat: fix unpacking of more than one file, and unpacking of zero-size bz2. Closes 4393
No binary (build failed)
—
(log yok)
| @@ -103,7 +103,9 @@ int FAST_FUNC bbunpack(char **argv, | |
| status = unpacker(&info); | |
| if (status < 0) | |
| exitcode = 1; | |
| - | xclose(STDOUT_FILENO); /* with error check! */ |
| + | |
| + | if (!(option_mask32 & OPT_STDOUT)) |
| + | xclose(STDOUT_FILENO); /* with error check! */ |
| if (filename) { | |
| char *del = new_name; | |
| @@ -143,6 +145,9 @@ int FAST_FUNC bbunpack(char **argv, | |
| } | |
| } while (*argv && *++argv); | |
| + | if (option_mask32 & OPT_STDOUT) |
| + | xclose(STDOUT_FILENO); /* with error check! */ |
| + | |
| return exitcode; | |
| } | |
| @@ -752,7 +752,14 @@ unpack_bz2_stream(int src_fd, int dst_fd) | |
| } | |
| } | |
| - | if (i != RETVAL_LAST_BLOCK) { |
| + | if (i != RETVAL_LAST_BLOCK |
| + | /* Observed case when i == RETVAL_OK: |
| + | * "bzcat z.bz2", where "z.bz2" is a bzipped zero-length file |
| + | * (to be exact, z.bz2 is exactly these 14 bytes: |
| + | * 42 5a 68 39 17 72 45 38 50 90 00 00 00 00). |
| + | */ |
| + | && i != RETVAL_OK |
| + | ) { |
| bb_error_msg("bunzip error %d", i); | |
| break; | |
| } | |
| @@ -1,54 +1,28 @@ | |
| #!/bin/sh | |
| - | |
| - | FAILCOUNT=0 |
| - | |
| - | ext=bz2 |
| - | |
| - | bb="busybox " |
| - | |
| - | unset LC_ALL |
| - | unset LC_MESSAGES |
| - | unset LANG |
| - | unset LANGUAGE |
| - | |
| - | hello_gz() { |
| - | # Gzipped "HELLO\n" |
| - | #_________________________ vvv vvv vvv vvv - mtime |
| - | $ECHO -ne "\x1f\x8b\x08\x00\x85\x1d\xef\x45\x02\x03\xf3\x70\xf5\xf1\xf1\xe7" |
| - | $ECHO -ne "\x02\x00\x6e\xd7\xac\xfd\x06\x00\x00\x00" |
| - | } |
| - | |
| - | hello_bz2() { |
| - | # Bzipped "HELLO\n" |
| - | $ECHO -ne "\x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\x5b\xb8\xe8\xa3\x00\x00" |
| - | $ECHO -ne "\x01\x44\x00\x00\x10\x02\x44\xa0\x00\x30\xcd\x00\xc3\x46\x29\x97" |
| - | $ECHO -ne "\x17\x72\x45\x38\x50\x90\x5b\xb8\xe8\xa3" |
| - | } |
| - | |
| - | prep() { |
| - | rm -f t* |
| - | hello_$ext >t1.$ext |
| - | hello_$ext >t2.$ext |
| - | } |
| - | |
| - | check() { |
| - | eval $2 >t_actual 2>&1 |
| - | if $ECHO -ne "$expected" | cmp - t_actual; then |
| - | echo "PASS: $1" |
| - | else |
| - | echo "FAIL: $1" |
| - | FAILCOUNT=$((FAILCOUNT + 1)) |
| - | fi |
| - | } |
| - | |
| - | mkdir testdir 2>/dev/null |
| - | ( |
| - | cd testdir || { echo "cannot cd testdir!"; exit 1; } |
| - | |
| - | expected="HELLO\nok\n" |
| - | prep; check "bzcat: dont delete src" "${bb}bzcat t2.bz2; test -f t2.bz2 && echo ok" |
| - | |
| - | ) |
| - | rm -rf testdir |
| - | |
| - | exit $((FAILCOUNT <= 255 ? FAILCOUNT : 255)) |
| + | # Copyright 2011 by Denys Vlasenko |
| + | # Licensed under GPLv2, see file LICENSE in this source tree. |
| + | |
| + | . ./testing.sh |
| + | |
| + | # testing "test name" "command" "expected result" "file input" "stdin" |
| + | |
| + | # "input" file is bzipped file with "a\n" data |
| + | testing "bzcat can print many files" \ |
| + | "$ECHO -ne '$hexdump' | bzcat input input; echo \$?" \ |
| + | "\ |
| + | a |
| + | a |
| + | 0 |
| + | " "\ |
| + | \x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\x63\x3e\xd6\xe2\x00\x00\ |
| + | \x00\xc1\x00\x00\x10\x20\x00\x20\x00\x21\x00\x82\xb1\x77\x24\x53\ |
| + | \x85\x09\x06\x33\xed\x6e\x20\ |
| + | " "" |
| + | |
| + | # "input" file is bzipped zero byte file |
| + | testing "bzcat can handle compressed zero-length bzip2 files" \ |
| + | "$ECHO -ne '$hexdump' | bzcat input input; echo \$?" \ |
| + | "0\n" \ |
| + | "\x42\x5a\x68\x39\x17\x72\x45\x38\x50\x90\x00\x00\x00\x00" "" |
| + | |
| + | exit $FAILCOUNT |