]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Improve memory management in the large zip test
authorTim Kientzle <kientzle@acm.org>
Tue, 31 Dec 2013 17:54:34 +0000 (09:54 -0800)
committerTim Kientzle <kientzle@acm.org>
Tue, 31 Dec 2013 17:54:34 +0000 (09:54 -0800)
libarchive/archive_write_set_format_zip.c
libarchive/test/test_write_format_zip_large.c

index 70e68aa1b15685b642ccc5b72a1e6177a261e56b..220acc0cabd798531c2fb0aa10974d074dc689db 100644 (file)
@@ -253,6 +253,7 @@ archive_write_zip_options(struct archive_write *a, const char *key,
                } else {
                        zip->crc32func = fake_crc32;
                }
+               return (ARCHIVE_OK);
        } else if (strcmp(key, "hdrcharset")  == 0) {
                /*
                 * Set the character set used in translating filenames.
index 03d28633a1ca6fc225613987c1069f51d22a2653..06878b369888b50d7541130cbb34cc409c606bba 100644 (file)
@@ -232,6 +232,28 @@ memory_read_skip(struct archive *a, void *_private, int64_t skip)
        return (new_position - old_position);
 }
 
+static struct fileblocks *
+fileblocks_new(void)
+{
+       struct fileblocks *fileblocks;
+
+       fileblocks = calloc(1, sizeof(struct fileblocks));
+       return fileblocks;
+}
+
+static void
+fileblocks_free(struct fileblocks *fileblocks)
+{
+       while (fileblocks->first != NULL) {
+               struct fileblock *b = fileblocks->first;
+               fileblocks->first = fileblocks->first->next;
+               free(b->buff);
+               free(b);
+       }
+       free(fileblocks);
+}
+
+
 /* The sizes of the entries we're going to generate. */
 static int64_t test_sizes[] = {
        /* Test for 32-bit signed overflow. */
@@ -291,7 +313,7 @@ DEFINE_TEST(test_write_format_zip_large)
 {
        int i;
        char namebuff[64];
-       struct fileblocks fileblocks;
+       struct fileblocks *fileblocks = fileblocks_new();
        struct archive_entry *ae;
        struct archive *a;
        int64_t  filesize;
@@ -300,17 +322,20 @@ DEFINE_TEST(test_write_format_zip_large)
        nullsize = (size_t)(1 * MB);
        nulldata = malloc(nullsize);
        memset(nulldata, 0xAA, nullsize);
-       memset(&fileblocks, 0, sizeof(fileblocks));
 
        /*
         * Open an archive for writing.
         */
        a = archive_write_new();
        archive_write_set_format_zip(a);
-       archive_write_set_options(a, "zip:compression=store");
-       archive_write_set_options(a, "zip:fakecrc32");
-       archive_write_set_bytes_per_block(a, 0); /* No buffering. */
-       archive_write_open(a, &fileblocks, NULL, memory_write, NULL);
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_set_options(a, "zip:compression=store"));
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_set_options(a, "zip:fakecrc32"));
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_set_bytes_per_block(a, 0)); /* No buffering. */
+       assertEqualIntA(a, ARCHIVE_OK,
+           archive_write_open(a, fileblocks, NULL, memory_write, NULL));
 
        /*
         * Write a series of large files to it.
@@ -321,10 +346,10 @@ DEFINE_TEST(test_write_format_zip_large)
                archive_entry_copy_pathname(ae, namebuff);
                archive_entry_set_mode(ae, S_IFREG | 0755);
                filesize = test_sizes[i];
-
                archive_entry_set_size(ae, filesize);
 
-               assertA(0 == archive_write_header(a, ae));
+               assertEqualIntA(a, ARCHIVE_OK,
+                   archive_write_header(a, ae));
                archive_entry_free(ae);
 
                /*
@@ -334,8 +359,8 @@ DEFINE_TEST(test_write_format_zip_large)
                        writesize = nullsize;
                        if ((int64_t)writesize > filesize)
                                writesize = (size_t)filesize;
-                       assertA((int)writesize
-                           == archive_write_data(a, nulldata, writesize));
+                       assertEqualIntA(a, (int)writesize,
+                           (int)archive_write_data(a, nulldata, writesize));
                        filesize -= writesize;
                }
        }
@@ -346,7 +371,6 @@ DEFINE_TEST(test_write_format_zip_large)
        assertA(0 == archive_write_header(a, ae));
        archive_entry_free(ae);
 
-
        /* Close out the archive. */
        assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
        assertEqualInt(ARCHIVE_OK, archive_write_free(a));
@@ -357,7 +381,7 @@ DEFINE_TEST(test_write_format_zip_large)
        a = archive_read_new();
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_support_format_zip_seekable(a));
-       verify_large_zip(a, &fileblocks);
+       verify_large_zip(a, fileblocks);
        assertEqualInt(ARCHIVE_OK, archive_read_free(a));
 
        /*
@@ -366,9 +390,9 @@ DEFINE_TEST(test_write_format_zip_large)
        a = archive_read_new();
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_support_format_zip_streamable(a));
-       verify_large_zip(a, &fileblocks);
+       verify_large_zip(a, fileblocks);
        assertEqualInt(ARCHIVE_OK, archive_read_free(a));
 
-       free(fileblocks.buff);
+       fileblocks_free(fileblocks);
        free(nulldata);
 }