]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Return uncompressed size if it's known, even if compressed size and/or CRC are deferred.
authorTim Kientzle <kientzle@acm.org>
Sat, 28 Dec 2013 23:58:36 +0000 (15:58 -0800)
committerTim Kientzle <kientzle@acm.org>
Sat, 28 Dec 2013 23:58:36 +0000 (15:58 -0800)
libarchive/archive_read_support_format_zip.c
libarchive/test/test_read_format_zip.c
libarchive/test/test_read_format_zip_zip64.c
libarchive/test/test_write_format_zip.c

index 1d232e480baef00f9186ad9c6e357cd33239a33d..2484fa390abb637699631acf44bbd2327591ef70 100644 (file)
@@ -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;
index 7df25ec2b343ed75dcbfe5f7cdfb8b9c3190bee0..c4ba0045990c6f3c5787341d2804900a9dc622e6 100644 (file)
@@ -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);
index e2e16514ccf9676bd6fc6e6f3de87299e6a114f2..ac3789f46b83c413e330633808d4aa25ff063946 100644 (file)
@@ -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);
 }
 
index c2c739f0ded08354b518bb4f26ef24ac0ad9ae13..a21184402506e09104cf8445bea4034937fe652b 100644 (file)
@@ -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);