]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Issue 249: Uncompressed CAB fails to read subfile when archive has certain structure.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Thu, 15 Mar 2012 05:49:37 +0000 (14:49 +0900)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Thu, 15 Mar 2012 05:50:59 +0000 (14:50 +0900)
libarchive/archive_read_support_format_cab.c
libarchive/test/test_read_format_cab.c

index 0bc7c999cbaf15699f3081f1bbc61a34b234a190..ac400465c9db577699606cac6f2761ed7195db89 100644 (file)
@@ -1793,9 +1793,8 @@ cab_consume_cfdata(struct archive_read *a, int64_t consumed_bytes)
                rbytes -= cbytes;
 
                if (cfdata->uncompressed_avail == 0 &&
-                   (cab->entry_cffolder->comptype == COMPTYPE_NONE ||
-                    cab->entry_cffile->folder == iFoldCONTINUED_PREV_AND_NEXT ||
-                        cab->entry_cffile->folder == iFoldCONTINUED_FROM_PREV)) {
+                  (cab->entry_cffile->folder == iFoldCONTINUED_PREV_AND_NEXT ||
+                   cab->entry_cffile->folder == iFoldCONTINUED_FROM_PREV)) {
                        /* We have not read any data yet. */
                        if (cbytes == cfdata->uncompressed_bytes_remaining) {
                                /* Skip whole current CFDATA. */
index 4e8607ec8f70fc8f1d22c26df6c8500351913a2b..8e7d55f84402498dfbdf36a4548a94f78e12b723 100644 (file)
@@ -269,13 +269,71 @@ finish:
        assertEqualInt(ARCHIVE_OK, archive_read_free(a));
 }
 
+/*
+ * Skip beginning files and Read the last file.
+ */
+static void
+verify2(const char *refname, enum comp_type comp)
+{
+       struct archive_entry *ae;
+       struct archive *a;
+       char buff[128];
+       char zero[128];
+
+       memset(zero, 0, sizeof(zero));
+       extract_reference_file(refname);
+       assert((a = archive_read_new()) != NULL);
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_read_open_filename(a, refname, 10240));
+
+       /* Verify regular empty. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       if (comp != STORE) {
+               assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       }
+       /* Verify regular file1. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+
+       /* Verify regular file2. */
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+       assertEqualInt((AE_IFREG | 0777), archive_entry_mode(ae));
+       assertEqualString("dir2/file2", archive_entry_pathname(ae));
+       assertEqualInt(0, archive_entry_uid(ae));
+       assertEqualInt(0, archive_entry_gid(ae));
+       assertEqualInt(file2_size, archive_entry_size(ae));
+       assertEqualInt(file2_size, archive_read_data(a, buff, file2_size));
+       assertEqualMem(buff, file2, file2_size);
+
+       /* End of archive. */
+       assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+       if (comp != STORE) {
+               assertEqualInt(4, archive_file_count(a));
+       } else {
+               assertEqualInt(3, archive_file_count(a));
+       }
+
+       /* Verify archive format. */
+       assertEqualIntA(a, ARCHIVE_COMPRESSION_NONE, archive_compression(a));
+       assertEqualIntA(a, ARCHIVE_FORMAT_CAB, archive_format(a));
+
+       /* Close the archive. */
+       assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+       assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
 DEFINE_TEST(test_read_format_cab)
 {
        /* Verify Cabinet file in no compression. */
        verify("test_read_format_cab_1.cab", STORE);
+       verify2("test_read_format_cab_1.cab", STORE);
        /* Verify Cabinet file in MSZIP. */
        verify("test_read_format_cab_2.cab", MSZIP);
+       verify2("test_read_format_cab_2.cab", MSZIP);
        /* Verify Cabinet file in LZX. */
        verify("test_read_format_cab_3.cab", LZX);
+       verify2("test_read_format_cab_3.cab", LZX);
 }