]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Test that archive_read_extract works correctly with Zip entries
authorTim Kientzle <kientzle@gmail.com>
Mon, 19 Sep 2011 04:54:56 +0000 (00:54 -0400)
committerTim Kientzle <kientzle@gmail.com>
Mon, 19 Sep 2011 04:54:56 +0000 (00:54 -0400)
that use length-at-end.

SVN-Revision: 3722

libarchive/archive_read_extract.c
libarchive/test/test_read_format_zip.c
libarchive/test/test_read_format_zip_length_at_end.zip.uu [new file with mode: 0644]

index 82bb286ad9435e99a251d8c4fd3f6b633d6cdc18..d45ea61e9a25e87a534fa6c890e62b7ea0fe4885 100644 (file)
@@ -108,7 +108,7 @@ archive_read_extract2(struct archive *_a, struct archive_entry *entry,
        if (r != ARCHIVE_OK)
                /* If _write_header failed, copy the error. */
                archive_copy_error(&a->archive, ad);
-       else if (archive_entry_size(entry) > 0)
+       else if (!archive_entry_size_is_set(entry) || archive_entry_size(entry) > 0)
                /* Otherwise, pour data into the entry. */
                r = copy_data(_a, ad);
        r2 = archive_write_finish_entry(ad);
index aae6cff7c15866357cb5cbf204a7d76d7560dfa5..96473135f0b1f1d3593e54c4ff1664682590c869 100644 (file)
@@ -141,8 +141,40 @@ finish:
        assertEqualInt(ARCHIVE_OK, archive_read_free(a));
 }
 
+/*
+ * Verify that test_read_extract correctly works with
+ * Zip entries that use length-at-end.
+ */
+static void
+test_extract_length_at_end(void)
+{
+       const char *refname = "test_read_format_zip_length_at_end.zip";
+       struct archive_entry *ae;
+       struct archive *a;
+
+       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));
+
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+
+       assertEqualString("hello.txt", archive_entry_pathname(ae));
+       assert(!archive_entry_size_is_set(ae));
+       assertEqualInt(0, archive_entry_size(ae));
+
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_extract(a, ae, 0));
+
+       assertFileContents("hello\x0A", 6, "hello.txt");
+
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+       assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+}
+
 DEFINE_TEST(test_read_format_zip)
 {
        test_basic();
        test_info_zip_ux();
+       test_extract_length_at_end();
 }
diff --git a/libarchive/test/test_read_format_zip_length_at_end.zip.uu b/libarchive/test/test_read_format_zip_length_at_end.zip.uu
new file mode 100644 (file)
index 0000000..41eda31
--- /dev/null
@@ -0,0 +1,8 @@
+begin 644 test_read_format_zip_length_at_end.zip
+M4$L#!!0`"``(`,NJ,C\````````````````)`!P`:&5L;&\N='AT550)``-^
+MPW9.A<-V3G5X"P`!!/4!```$%````,M(S<G)YP(`4$L'""`P.C8(````!@``
+M`%!+`0(>`Q0`"``(`,NJ,C\@,#HV"`````8````)`!@```````$```"D@0``
+M``!H96QL;RYT>'155`4``W[#=DYU>`L``03U`0``!!0```!02P4&``````$`
+,`0!/````6P``````
+`
+end