aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2003-01-28 01:45:48 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2003-01-28 01:45:48 +0000
commit21110a0aa2bda7346bdd916bbc027dfa38ee7c12 (patch)
treee2ecea1661a39605675307f029bbacc68faa97e9
parenta99534354a538573770d2b9835856fcfc017dab1 (diff)
downloadbusybox-21110a0aa2bda7346bdd916bbc027dfa38ee7c12.tar.gz
Fix long standing bug with old gnu tar files, add a check so tar will
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.
-rw-r--r--archival/Config.in17
-rw-r--r--archival/libunarchive/data_extract_all.c2
-rw-r--r--archival/libunarchive/get_header_tar.c31
3 files changed, 31 insertions, 19 deletions
diff --git a/archival/Config.in b/archival/Config.in
index affde32c8..cc65b6db4 100644
--- a/archival/Config.in
+++ b/archival/Config.in
@@ -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"
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index 9c4510e6b..1eb8bb388 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -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);
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index 5fed7c1bf..2cb141ede 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -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