Fix tar hard links
authorGlenn L McGrath <bug1@ihug.co.nz>
Thu, 27 Nov 2003 00:01:43 +0000 (00:01 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Thu, 27 Nov 2003 00:01:43 +0000 (00:01 -0000)
archival/libunarchive/data_extract_all.c
archival/libunarchive/get_header_tar.c

index bf3be5b354799d1c83dad7af1ec26f6f98dad19a..b77cd11aec9ecf0cf948408c9324bd21458ad44b 100644 (file)
@@ -66,8 +66,9 @@ extern void data_extract_all(archive_handle_t *archive_handle)
                }
        }
 
-       /* Handle hard links seperately */
-       if (!S_ISLNK(file_header->mode) && (file_header->link_name) && (file_header->size == 0)) {
+       /* Handle hard links seperately 
+        * We identified hard links as regular files of size 0 with a symlink */
+       if (S_ISREG(file_header->mode) && (file_header->link_name) && (file_header->size == 0)) {
                /* hard link */
                res = link(file_header->link_name, file_header->name);
                if ((res == -1) && !(archive_handle->flags & ARCHIVE_EXTRACT_QUIET)) {
index 603535a4cbd20f229dadcfa6258becde05b5610a..561de1c03e7094c022e95c2169a59980f8bd3727 100644 (file)
@@ -151,10 +151,9 @@ extern char get_header_tar(archive_handle_t *archive_handle)
                file_header->mode |= S_IFIFO;
                break;
 # endif
-       /* hard links are detected as entries with 0 size, a link name, 
-        * and not being a symlink, hence we have nothing to do here */
+       /* hard links are detected as regular files with 0 size and a link name */
        case '1':
-               file_header->mode |= ~S_IFLNK;
+               file_header->mode &= (S_IFREG | 07777);
                break;
 # ifdef CONFIG_FEATURE_TAR_GNU_EXTENSIONS
        case 'L': {