tar: fix a bug where autodetection messes up -z on extract
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Feb 2011 19:01:11 +0000 (20:01 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 6 Feb 2011 19:01:11 +0000 (20:01 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/libarchive/get_header_tar_gz.c
archival/tar.c
include/archive.h
testsuite/tar.tests

index b09f8691c769237728ec4189a07ccdc8b909ee98..889fed0d9aa9eaa434653adb794a0cf29ad78d64 100644 (file)
@@ -9,7 +9,7 @@
 char FAST_FUNC get_header_tar_gz(archive_handle_t *archive_handle)
 {
 #if BB_MMU
-       unsigned char magic[2];
+       uint16_t magic;
 #endif
 
        /* Can't lseek over pipes */
@@ -21,7 +21,7 @@ char FAST_FUNC get_header_tar_gz(archive_handle_t *archive_handle)
 #if BB_MMU
        xread(archive_handle->src_fd, &magic, 2);
        /* Can skip this check, but error message will be less clear */
-       if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) {
+       if (magic != GZIP_MAGIC) {
                bb_error_msg_and_die("invalid gzip magic");
        }
 #endif
index e9dc41fe115c0e7115226ca58c6825b21103197e..1e3cecf44cc2e7c7c006225a06b87ccf11785b98 100644 (file)
@@ -1060,8 +1060,10 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
                        tar_handle->src_fd = tar_fd;
                        tar_handle->seek = seek_by_read;
                } else {
-                       if (ENABLE_FEATURE_TAR_AUTODETECT && flags == O_RDONLY) {
-                               get_header_ptr = get_header_tar;
+                       if (ENABLE_FEATURE_TAR_AUTODETECT
+                        && flags == O_RDONLY
+                        && get_header_ptr == get_header_tar
+                       ) {
                                tar_handle->src_fd = open_zipped(tar_filename);
                                if (tar_handle->src_fd < 0)
                                        bb_perror_msg_and_die("can't open '%s'", tar_filename);
index ba6d323e0458e6e43f982daef8ee0869b7aeac5c..49c478728af43a0ac46d6da8b8af652d531bfa7e 100644 (file)
@@ -8,22 +8,22 @@ enum {
 #if BB_BIG_ENDIAN
        COMPRESS_MAGIC = 0x1f9d,
        GZIP_MAGIC  = 0x1f8b,
-       BZIP2_MAGIC = 'B' * 256 + 'Z',
+       BZIP2_MAGIC = 256 * 'B' + 'Z',
        /* .xz signature: 0xfd, '7', 'z', 'X', 'Z', 0x00 */
        /* More info at: http://tukaani.org/xz/xz-file-format.txt */
-       XZ_MAGIC1   = 0xfd * 256 + '7',
-       XZ_MAGIC2   = (('z' * 256 + 'X') * 256 + 'Z') * 256 + 0,
+       XZ_MAGIC1   = 256 * 0xfd + '7',
+       XZ_MAGIC2   = 256 * (256 * (256 * 'z' + 'X') + 'Z') + 0,
        /* Different form: 32 bits, then 16 bits: */
-       XZ_MAGIC1a  = ((0xfd * 256 + '7') * 256 + 'z') * 256 + 'X',
-       XZ_MAGIC2a  = 'Z' * 256 + 0,
+       XZ_MAGIC1a  = 256 * (256 * (256 * 0xfd + '7') + 'z') + 'X',
+       XZ_MAGIC2a  = 256 * 'Z' + 0,
 #else
        COMPRESS_MAGIC = 0x9d1f,
        GZIP_MAGIC  = 0x8b1f,
-       BZIP2_MAGIC = 'Z' * 256 + 'B',
-       XZ_MAGIC1   = '7' * 256 + 0xfd,
-       XZ_MAGIC2   = ((0 * 256 + 'Z') * 256 + 'X') * 256 + 'z',
-       XZ_MAGIC1a  = (('X' * 256 + 'z') * 256 + '7') * 256 + 0xfd,
-       XZ_MAGIC2a  = 0 * 256 + 'Z',
+       BZIP2_MAGIC = 'B' + 'Z' * 256,
+       XZ_MAGIC1   = 0xfd + '7' * 256,
+       XZ_MAGIC2   = 'z' + ('X' + ('Z' + 0 * 256) * 256) * 256,
+       XZ_MAGIC1a  = 0xfd + ('7' + ('z' + 'X' * 256) * 256) * 256,
+       XZ_MAGIC2a  = 'Z' + 0 * 256,
 #endif
 };
 
index f2f4e93483996e8ba614417b9c981aef4c6ea88e..824d6d54e9f936cb10f4c98ccc2a8ac3a328f31d 100755 (executable)
@@ -154,6 +154,20 @@ dr-xr-x--- input_dir
 SKIP=
 }
 
+# Had a bug where on extrace autodetect first "switched off" -z
+# and then failed to recognize .tgz extension
+testing "tar extract tgz" "\
+dd count=1 bs=1M if=/dev/zero of=F0 2>/dev/null
+tar -czf F0.tgz F0
+rm F0
+tar -xzvf F0.tgz && echo Ok
+rm F0 || echo BAD
+" "\
+F0
+Ok
+" \
+"" ""
+
 
 cd .. && rm -rf tar.tempdir || exit 1