From 21110a0aa2bda7346bdd916bbc027dfa38ee7c12 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Tue, 28 Jan 2003 01:45:48 +0000 Subject: 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. --- archival/libunarchive/data_extract_all.c | 2 ++ archival/libunarchive/get_header_tar.c | 31 +++++++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) (limited to 'archival/libunarchive') diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c index 9c4510e..1eb8bb3 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 5fed7c1..2cb141e 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 -- cgit v1.1