diff options
-rw-r--r-- | archival/libunarchive/get_header_tar.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c index 561de1c..4e31b85 100644 --- a/archival/libunarchive/get_header_tar.c +++ b/archival/libunarchive/get_header_tar.c @@ -12,6 +12,10 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * FIXME: Better checking required in oldcompatability mode, + * the file db.1.85.tar.gz from sleepycat.com has trailing garbage + * GNU tar can handle it, busybox tar reports invalid tar header. */ #include <stdio.h> @@ -106,14 +110,6 @@ extern char get_header_tar(archive_handle_t *archive_handle) file_header->name = concat_path_file(tar.formated.prefix, tar.formated.name); } - { /* Strip trailing '/' in directories */ - char *tmp = last_char_is(file_header->name, '/'); - if (tmp) { - *tmp = '\0'; - } - } - - file_header->mode = strtol(tar.formated.mode, NULL, 8); file_header->uid = strtol(tar.formated.uid, NULL, 8); file_header->gid = strtol(tar.formated.gid, NULL, 8); @@ -126,12 +122,14 @@ extern char get_header_tar(archive_handle_t *archive_handle) /* Fix mode, used by the old format */ switch (tar.formated.typeflag) { -# ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY +#ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY case 0: case '0': if (last_char_is(file_header->name, '/')) { + printf("directory\n"); file_header->mode |= S_IFDIR; } else { + printf("regular file\n"); file_header->mode |= S_IFREG; } break; @@ -150,12 +148,12 @@ extern char get_header_tar(archive_handle_t *archive_handle) case '6': file_header->mode |= S_IFIFO; break; -# endif +#endif /* hard links are detected as regular files with 0 size and a link name */ case '1': file_header->mode &= (S_IFREG | 07777); break; -# ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS +#ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS case 'L': { longname = xmalloc(file_header->size + 1); archive_xread_all(archive_handle, longname, file_header->size); @@ -179,7 +177,14 @@ extern char get_header_tar(archive_handle_t *archive_handle) case 'S': case 'V': bb_error_msg("Ignoring GNU extension type %c", tar.formated.typeflag); -# endif +#endif + } + { /* Strip trailing '/' in directories */ + /* Must be done after mode is set as '/' is used to check if its a directory */ + char *tmp = last_char_is(file_header->name, '/'); + if (tmp) { + *tmp = '\0'; + } } if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { |