From: Glenn L McGrath Date: Tue, 9 Sep 2003 17:41:03 +0000 (-0000) Subject: If a tar entry is a regualr file ending in a '/' then its really a X-Git-Tag: 1_00_pre3~20 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=87af49f26b2293ab60d0f13d2a14cad66e02a6ff;p=oweals%2Fbusybox.git If a tar entry is a regualr file ending in a '/' then its really a directory. From http://www.gnu.org/manual/tar/html_node/tar_123.html REGTYPE AREGTYPE These flags represent a regular file. In order to be compatible with older versions of tar, a typeflag value of AREGTYPE should be silently recognized as a regular file. New archives should be created using REGTYPE. Also, for backward compatibility, tar treats a regular file whose name ends with a slash as a directory. --- diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c index 3bbe15d36..55c9a22f4 100644 --- a/archival/libunarchive/get_header_tar.c +++ b/archival/libunarchive/get_header_tar.c @@ -105,10 +105,6 @@ extern char get_header_tar(archive_handle_t *archive_handle) } else { file_header->name = concat_path_file(tar.formated.prefix, tar.formated.name); } - tmp = last_char_is(archive_handle->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); @@ -126,7 +122,11 @@ extern char get_header_tar(archive_handle_t *archive_handle) # ifdef CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY case 0: case '0': - file_header->mode |= S_IFREG; + if (last_char_is(file_header->name, '/')) { + file_header->mode |= S_IFDIR; + } else { + file_header->mode |= S_IFREG; + } break; #if 0 /* hard links are detected as entries with 0 size, a link name,