From: Tim Kientzle Date: Sat, 28 Dec 2013 23:58:36 +0000 (-0800) Subject: Return uncompressed size if it's known, even if compressed size and/or CRC are deferred. X-Git-Tag: v3.1.900a~327^2~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09d1c9bcac13d0e2f0c476f5bc83ae351a13b9be;p=thirdparty%2Flibarchive.git Return uncompressed size if it's known, even if compressed size and/or CRC are deferred. --- diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 1d232e480..2484fa390 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -1361,7 +1361,8 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, archive_entry_set_ctime(entry, zip_entry->ctime, 0); archive_entry_set_atime(entry, zip_entry->atime, 0); /* Set the size only if it's meaningful. */ - if (0 == (zip_entry->flags & ZIP_LENGTH_AT_END)) + if (0 == (zip_entry->flags & ZIP_LENGTH_AT_END) + || zip_entry->uncompressed_size > 0) archive_entry_set_size(entry, zip_entry->uncompressed_size); zip->entry_bytes_remaining = zip_entry->compressed_size; diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index 7df25ec2b..c4ba00459 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -84,11 +84,9 @@ verify_basic(struct archive *a, int seek_checks) assertEqualIntA(a, archive_read_has_encrypted_entries(a), 0); if (seek_checks) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(64, archive_entry_size_is_set(ae)); - } else { - failure("file2 has length-at-end, so we shouldn't see a valid size when streaming"); - assertEqualInt(0, archive_entry_size_is_set(ae)); } + assert(archive_entry_size_is_set(ae)); + assertEqualInt(18, archive_entry_size(ae)); if (libz_enabled) { failure("file2 has a bad CRC, so read should fail and not change buff"); memset(buff, 'a', 19); diff --git a/libarchive/test/test_read_format_zip_zip64.c b/libarchive/test/test_read_format_zip_zip64.c index e2e16514c..ac3789f46 100644 --- a/libarchive/test/test_read_format_zip_zip64.c +++ b/libarchive/test/test_read_format_zip_zip64.c @@ -52,14 +52,22 @@ verify_file0_seek(struct archive *a) } static void -verify_file0_stream(struct archive *a) +verify_file0_stream(struct archive *a, int size_known) { struct archive_entry *ae; assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("-", archive_entry_pathname(ae)); assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); - assertEqualInt(0, archive_entry_size_is_set(ae)); + if (size_known) { + // zip64b has the uncompressed size at the beginning, + // plus CRC and compressed size using length-at-end. + assert(archive_entry_size_is_set(ae)); + assertEqualInt(6, archive_entry_size(ae)); + } else { + // zip64a does not have a size at the beginning at all. + assert(!archive_entry_size_is_set(ae)); + } #ifdef HAVE_ZLIB_H { char data[16]; @@ -92,7 +100,7 @@ DEFINE_TEST(test_read_format_zip_zip64a) assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_streamable(a)); assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1)); - verify_file0_stream(a); + verify_file0_stream(a, 0); free(p); } @@ -116,7 +124,7 @@ DEFINE_TEST(test_read_format_zip_zip64b) assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_streamable(a)); assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1)); - verify_file0_stream(a); + verify_file0_stream(a, 1); free(p); } diff --git a/libarchive/test/test_write_format_zip.c b/libarchive/test/test_write_format_zip.c index c2c739f0d..a21184402 100644 --- a/libarchive/test/test_write_format_zip.c +++ b/libarchive/test/test_write_format_zip.c @@ -289,10 +289,9 @@ verify_contents(struct archive *a, int seeking) assertEqualString("file", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(8, archive_entry_size(ae)); - } else { - assertEqualInt(0, archive_entry_size_is_set(ae)); } + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -307,10 +306,9 @@ verify_contents(struct archive *a, int seeking) assertEqualString("file2", archive_entry_pathname(ae)); if (seeking) { assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - } else { - assertEqualInt(0, archive_entry_size_is_set(ae)); } + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -375,12 +373,10 @@ verify_contents(struct archive *a, int seeking) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_deflate", archive_entry_pathname(ae)); - if (seeking) { + if (seeking) assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(8, archive_entry_size(ae)); - } else { - assertEqualInt(0, archive_entry_size(ae)); - } + assertEqualInt(8, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -393,12 +389,10 @@ verify_contents(struct archive *a, int seeking) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_deflate", archive_entry_pathname(ae)); - if (seeking) { + if (seeking) assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assertEqualInt(4, archive_entry_size(ae)); - } else { - assertEqualInt(0, archive_entry_size(ae)); - } + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "1234", 4); @@ -464,13 +458,10 @@ verify_contents(struct archive *a, int seeking) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file_stored", archive_entry_pathname(ae)); - if (seeking) { + if (seeking) assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - assert(archive_entry_size_is_set(ae)); - assertEqualInt(8, archive_entry_size(ae)); - } else { - assertEqualInt(0, archive_entry_size_is_set(ae)); - } + assert(archive_entry_size_is_set(ae)); + assertEqualInt(8, archive_entry_size(ae)); assertEqualIntA(a, 8, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "12345678", 8); @@ -483,12 +474,10 @@ verify_contents(struct archive *a, int seeking) assertEqualInt(0, archive_entry_atime(ae)); assertEqualInt(0, archive_entry_ctime(ae)); assertEqualString("file2_stored", archive_entry_pathname(ae)); - if (seeking) { - assertEqualInt(4, archive_entry_size(ae)); + if (seeking) assertEqualInt(AE_IFREG | 0755, archive_entry_mode(ae)); - } else { - assertEqualInt(0, archive_entry_size_is_set(ae)); - } + assertEqualInt(4, archive_entry_size(ae)); + assert(archive_entry_size_is_set(ae)); assertEqualIntA(a, 4, archive_read_data(a, filedata, sizeof(filedata))); assertEqualMem(filedata, "ACEG", 4);