From: Tim Kientzle Date: Mon, 19 Sep 2011 04:54:56 +0000 (-0400) Subject: Test that archive_read_extract works correctly with Zip entries X-Git-Tag: v3.0.0a~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f29f4dff1995925fe786b330457feadee59b7bcc;p=thirdparty%2Flibarchive.git Test that archive_read_extract works correctly with Zip entries that use length-at-end. SVN-Revision: 3722 --- diff --git a/libarchive/archive_read_extract.c b/libarchive/archive_read_extract.c index 82bb286ad..d45ea61e9 100644 --- a/libarchive/archive_read_extract.c +++ b/libarchive/archive_read_extract.c @@ -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); diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index aae6cff7c..96473135f 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -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 index 000000000..41eda3135 --- /dev/null +++ b/libarchive/test/test_read_format_zip_length_at_end.zip.uu @@ -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`Q0`"``(`,NJ,C\@,#HV"`````8````)`!@```````$```"D@0`` +M``!H96QL;RYT>'155`4``W[#=DYU>`L``03U`0``!!0```!02P4&``````$` +,`0!/````6P`````` +` +end