Fix long standing bug with old gnu tar files, add a check so tar will
authorGlenn L McGrath <bug1@ihug.co.nz>
Tue, 28 Jan 2003 01:45:48 +0000 (01:45 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Tue, 28 Jan 2003 01:45:48 +0000 (01:45 -0000)
complain "unknown file type" if it tries to extract an oldgnu tar file
and TAR_FEATURE_OLDGNU_COMPATABILITY sint defined.
Print a warning if unisupported gnu extensions are encountered.

archival/Config.in
archival/libunarchive/data_extract_all.c
archival/libunarchive/get_header_tar.c

index affde32c8eb2c5bc260e835d4c08c2b4d21c0a3e..cc65b6db44189e64e8e4d461d404b45ceb4543a3 100644 (file)
@@ -182,26 +182,29 @@ config CONFIG_FEATURE_TAR_GZIP
        help
          Please submit a patch to add help text for this item.
 
-config CONFIG_FEATURE_TAR_OLD_FORMAT
+config CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
        bool "  Enable support for old tar header format"
-       default n
+       default N
        depends on CONFIG_TAR
        help
-         Please submit a patch to add help text for this item.
+         This option is required to unpack archives created with
+         in the old GNU format, help to kill this old format by
+         repacking your ancient archives with the new format.
 
-config CONFIG_FEATURE_GNUTAR_LONG_FILENAME
-       bool "  Enable support for GNU long filenames"
+config CONFIG_FEATURE_TAR_GNU_EXTENSIONS
+       bool "  Enable support for some GNU tar extensions"
        default y
        depends on CONFIG_TAR
        help
-         Please submit a patch to add help text for this item.
+         With this option usybox supports the GNU long filename
+         and linkanmes.
 
 config CONFIG_FEATURE_UNARCHIVE_TAPE
        bool "  Enable tape drive support"
        default n
        depends on CONFIG_TAR || CONFIG_CPIO
        help
-         Please submit a patch to add help text for this item.
+         I dont think this is needed anymore.
 
 config CONFIG_UNCOMPRESS
        bool "uncompress"
index 9c4510e6b1ebff4131bf652feecfed8ec4ebfab9..1eb8bb388ab1b2ab1fee93f3473a2e36c146728d 100644 (file)
@@ -84,6 +84,8 @@ extern void data_extract_all(archive_handle_t *archive_handle)
                                perror_msg("Cannot create node %s", file_header->name);
                        }
                        break;
+               default:
+                       error_msg_and_die("Unrecognised file type");
        }
 
        chmod(file_header->name, file_header->mode);
index 5fed7c1bf8ba1e2001dfbd1e45ab217370bc269f..2cb141ede6d4cfdfcc23bd0388b86e78375f29d2 100644 (file)
@@ -20,7 +20,7 @@
 #include "unarchive.h"
 #include "libbb.h"
 
-#ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
+#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
 static char *longname = NULL;
 static char *linkname = NULL;
 #endif
@@ -72,7 +72,7 @@ extern char get_header_tar(archive_handle_t *archive_handle)
         * 0's are for the old tar format
         */
        if (strncmp(tar.formated.magic, "ustar", 5) != 0) {
-#ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
+#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
                if (strncmp(tar.formated.magic, "\0\0\0\0\0", 5) != 0)
 #endif
                        error_msg_and_die("Invalid tar magic");
@@ -90,7 +90,7 @@ extern char get_header_tar(archive_handle_t *archive_handle)
                return(EXIT_FAILURE);
        }
 
-#ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
+#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
        if (longname) {
                file_header->name = longname;
                longname = NULL;
@@ -120,33 +120,34 @@ extern char get_header_tar(archive_handle_t *archive_handle)
        file_header->device = (dev_t) ((strtol(tar.formated.devmajor, NULL, 8) << 8) +
                                 strtol(tar.formated.devminor, NULL, 8));
 
-#if defined CONFIG_FEATURE_TAR_OLD_FORMAT || defined CONFIG_FEATURE_GNUTAR_LONG_FILENAME
+#if defined CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY || defined CONFIG_FEATURE_TAR_GNU_EXTENSIONS
        /* Fix mode, used by the old format */
        switch (tar.formated.typeflag) {
-# ifdef CONFIG_FEATURE_TAR_OLD_FORMAT
+# ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
        case 0:
+       case '0':
                file_header->mode |= S_IFREG;
                break;
-       case 1:
+       case '1':
                error_msg("Internal hard link not supported");
                break;
-       case 2:
+       case '2':
                file_header->mode |= S_IFLNK;
                break;
-       case 3:
+       case '3':
                file_header->mode |= S_IFCHR;
                break;
-       case 4:
+       case '4':
                file_header->mode |= S_IFBLK;
                break;
-       case 5:
+       case '5':
                file_header->mode |= S_IFDIR;
                break;
-       case 6:
+       case '6':
                file_header->mode |= S_IFIFO;
                break;
 # endif
-# ifdef CONFIG_FEATURE_GNUTAR_LONG_FILENAME
+# ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
        case 'L': {
                        longname = xmalloc(file_header->size + 1);
                        archive_xread_all(archive_handle, longname, file_header->size);
@@ -164,6 +165,12 @@ extern char get_header_tar(archive_handle_t *archive_handle)
                        file_header->name = linkname;
                        return(get_header_tar(archive_handle));
                }
+       case 'D':
+       case 'M':
+       case 'N':
+       case 'S':
+       case 'V':
+               error_msg("Ignoring GNU extension type %c", tar.formated.typeflag);
 # endif
        }
 #endif