gzip: fix a case where tar xzf fails (we use uninitialized fd)
[oweals/busybox.git] / archival / libunarchive / get_header_cpio.c
index f0b07b56c31b495cc1af0465b9d0ec9a1f8a060b..3f513551295ceab789f956292a7eef04e4f84c24 100644 (file)
@@ -16,8 +16,9 @@ typedef struct hardlinks_s {
 char get_header_cpio(archive_handle_t *archive_handle)
 {
        static hardlinks_t *saved_hardlinks = NULL;
-       static unsigned short pending_hardlinks = 0;
+       static unsigned pending_hardlinks = 0;
        static int inode;
+
        file_header_t *file_header = archive_handle->file_header;
        char cpio_header[110];
        int namesize;
@@ -30,7 +31,7 @@ char get_header_cpio(archive_handle_t *archive_handle)
                tmp = saved_hardlinks;
                oldtmp = NULL;
 
-               file_header->link_name = file_header->name;
+               file_header->link_target = file_header->name;
                file_header->size = 0;
 
                while (tmp) {
@@ -56,7 +57,7 @@ char get_header_cpio(archive_handle_t *archive_handle)
                                saved_hardlinks = tmp;
                }
 
-               file_header->name = file_header->link_name;
+               file_header->name = file_header->link_target;
 
                if (pending_hardlinks > 1) {
                        bb_error_msg("error resolving hardlink: archive made by GNU cpio 2.0-2.2?");
@@ -103,7 +104,7 @@ char get_header_cpio(archive_handle_t *archive_handle)
                /* Always round up */
                printf("%d blocks\n", (int) (archive_handle->offset % 512 ?
                                             archive_handle->offset / 512 + 1 :
-                                             archive_handle->offset / 512
+                                            archive_handle->offset / 512
                                            ));
                if (saved_hardlinks) { /* Bummer - we still have unresolved hardlinks */
                        hardlinks_t *tmp = saved_hardlinks;
@@ -122,12 +123,12 @@ char get_header_cpio(archive_handle_t *archive_handle)
        }
 
        if (S_ISLNK(file_header->mode)) {
-               file_header->link_name = xzalloc(file_header->size + 1);
-               xread(archive_handle->src_fd, file_header->link_name, file_header->size);
+               file_header->link_target = xzalloc(file_header->size + 1);
+               xread(archive_handle->src_fd, file_header->link_target, file_header->size);
                archive_handle->offset += file_header->size;
                file_header->size = 0; /* Stop possible seeks in future */
        } else {
-               file_header->link_name = NULL;
+               file_header->link_target = NULL;
        }
        if (nlink > 1 && !S_ISDIR(file_header->mode)) {
                if (file_header->size == 0) { /* Put file on a linked list for later */
@@ -154,7 +155,7 @@ char get_header_cpio(archive_handle_t *archive_handle)
 
        archive_handle->offset += file_header->size;
 
-       free(file_header->link_name);
+       free(file_header->link_target);
 
-       return (EXIT_SUCCESS);
+       return EXIT_SUCCESS;
 }