diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-01-28 01:45:48 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-01-28 01:45:48 +0000 |
commit | 21110a0aa2bda7346bdd916bbc027dfa38ee7c12 (patch) | |
tree | e2ecea1661a39605675307f029bbacc68faa97e9 /archival/libunarchive | |
parent | a99534354a538573770d2b9835856fcfc017dab1 (diff) | |
download | busybox-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.
Diffstat (limited to 'archival/libunarchive')
-rw-r--r-- | archival/libunarchive/data_extract_all.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar.c | 31 |
2 files changed, 21 insertions, 12 deletions
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 |