If a tar entry is a regualr file ending in a '/' then its really a
authorGlenn L McGrath <bug1@ihug.co.nz>
Tue, 9 Sep 2003 17:41:03 +0000 (17:41 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Tue, 9 Sep 2003 17:41:03 +0000 (17:41 -0000)
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.

archival/libunarchive/get_header_tar.c

index 3bbe15d36a32e83ea26b4855a60c18535f59966d..55c9a22f4d3eb234cfb25df288bacaa96fad8359 100644 (file)
@@ -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,