libarchive: open_zipped() does not need to check extensions for e.g. gzip 1_22_stable
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 10 Jan 2014 13:06:57 +0000 (14:06 +0100)
committerMike Frysinger <vapier@gentoo.org>
Tue, 21 Oct 2014 19:11:54 +0000 (15:11 -0400)
We only need to check for signature-less extensions,
currently only .lzma. The rest can be happily autodetected.

This fixes "zcat FILE_WITHOUT_GZ_EXT" case, among others.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
(cherry picked from commit 7c47b560a8fc97956dd8132bd7f1863d83c19866)
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
archival/libarchive/open_transformer.c

index 4e98264418709116d430b4749e1339a31e9a4acc..1aeba13bc9eb6f1256ed4ab2660935ff0734b993 100644 (file)
@@ -182,27 +182,26 @@ int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected)
 
 int FAST_FUNC open_zipped(const char *fname)
 {
-       char *sfx;
        int fd;
 
        fd = open(fname, O_RDONLY);
        if (fd < 0)
                return fd;
 
-       sfx = strrchr(fname, '.');
-       if (sfx) {
-               sfx++;
-               if (ENABLE_FEATURE_SEAMLESS_LZMA && strcmp(sfx, "lzma") == 0)
-                       /* .lzma has no header/signature, just trust it */
+       if (ENABLE_FEATURE_SEAMLESS_LZMA) {
+               /* .lzma has no header/signature, can only detect it by extension */
+               char *sfx = strrchr(fname, '.');
+               if (sfx && strcmp(sfx+1, "lzma") == 0) {
                        open_transformer_with_sig(fd, unpack_lzma_stream, "unlzma");
-               else
-               if ((ENABLE_FEATURE_SEAMLESS_GZ && strcmp(sfx, "gz") == 0)
-                || (ENABLE_FEATURE_SEAMLESS_BZ2 && strcmp(sfx, "bz2") == 0)
-                || (ENABLE_FEATURE_SEAMLESS_XZ && strcmp(sfx, "xz") == 0)
-               ) {
-                       setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 1);
+                       return fd;
                }
        }
+       if ((ENABLE_FEATURE_SEAMLESS_GZ)
+        || (ENABLE_FEATURE_SEAMLESS_BZ2)
+        || (ENABLE_FEATURE_SEAMLESS_XZ)
+       ) {
+               setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 1);
+       }
 
        return fd;
 }