diff options
Diffstat (limited to 'libarchive/test/test_read_format_zip.c')
-rw-r--r-- | libarchive/test/test_read_format_zip.c | 165 |
1 files changed, 129 insertions, 36 deletions
diff --git a/libarchive/test/test_read_format_zip.c b/libarchive/test/test_read_format_zip.c index 14c5ada81053..b6e957a96cec 100644 --- a/libarchive/test/test_read_format_zip.c +++ b/libarchive/test/test_read_format_zip.c @@ -32,29 +32,29 @@ __FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_format_zip.c 189482 2009- static int extract_one(struct archive* a, struct archive_entry* ae, uint32_t crc) { - la_ssize_t fsize, bytes_read; - uint8_t* buf; - int ret = 1; - uint32_t computed_crc; - - fsize = (la_ssize_t) archive_entry_size(ae); - buf = malloc(fsize); - if(buf == NULL) - return 1; - - bytes_read = archive_read_data(a, buf, fsize); - if(bytes_read != fsize) { - assertEqualInt(bytes_read, fsize); - goto fn_exit; - } - - computed_crc = crc32(0, buf, fsize); - assertEqualInt(computed_crc, crc); - ret = 0; + la_ssize_t fsize, bytes_read; + uint8_t* buf; + int ret = 1; + uint32_t computed_crc; + + fsize = (la_ssize_t) archive_entry_size(ae); + buf = malloc(fsize); + if(buf == NULL) + return 1; + + bytes_read = archive_read_data(a, buf, fsize); + if(bytes_read != fsize) { + assertEqualInt(bytes_read, fsize); + goto fn_exit; + } + + computed_crc = crc32(0, buf, fsize); + assertEqualInt(computed_crc, crc); + ret = 0; fn_exit: - free(buf); - return ret; + free(buf); + return ret; } static @@ -111,7 +111,7 @@ verify_basic(struct archive *a, int seek_checks) int64_t o; assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualString("ZIP 1.0 (uncompressed)", archive_format_name(a)); + assertEqualString("ZIP 1.0 (uncompressed)", archive_format_name(a)); assertEqualString("dir/", archive_entry_pathname(ae)); assertEqualInt(1179604249, archive_entry_mtime(ae)); assertEqualInt(0, archive_entry_size(ae)); @@ -124,7 +124,7 @@ verify_basic(struct archive *a, int seek_checks) assertEqualInt((int)s, 0); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); + assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); assertEqualString("file1", archive_entry_pathname(ae)); assertEqualInt(1179604289, archive_entry_mtime(ae)); if (seek_checks) @@ -144,7 +144,7 @@ verify_basic(struct archive *a, int seek_checks) } assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); + assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); assertEqualString("file2", archive_entry_pathname(ae)); assertEqualInt(1179605932, archive_entry_mtime(ae)); assertEqualInt(archive_entry_is_encrypted(ae), 0); @@ -166,7 +166,7 @@ verify_basic(struct archive *a, int seek_checks) assert(archive_errno(a) != 0); } assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); - assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); + assertEqualString("ZIP 2.0 (deflation)", archive_format_name(a)); /* Verify the number of files read. */ failure("the archive file has three files"); assertEqualInt(3, archive_file_count(a)); @@ -493,9 +493,14 @@ DEFINE_TEST(test_read_format_zip_lzma_one_file) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -513,9 +518,14 @@ DEFINE_TEST(test_read_format_zip_lzma_one_file_blockread) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -533,9 +543,14 @@ DEFINE_TEST(test_read_format_zip_lzma_multi) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -565,9 +580,14 @@ DEFINE_TEST(test_read_format_zip_lzma_multi_blockread) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -598,9 +618,14 @@ DEFINE_TEST(test_read_format_zip_bzip2_one_file) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { + skipping("bzip2 is not fully supported on this platform"); + archive_read_close(a); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -618,9 +643,14 @@ DEFINE_TEST(test_read_format_zip_bzip2_one_file_blockread) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { + skipping("bzip2 is not fully supported on this platform"); + archive_read_close(a); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -638,9 +668,14 @@ DEFINE_TEST(test_read_format_zip_bzip2_multi) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { + skipping("bzip2 is not fully supported on this platform"); + archive_read_close(a); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -670,9 +705,14 @@ DEFINE_TEST(test_read_format_zip_bzip2_multi_blockread) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { + skipping("bzip2 is not fully supported on this platform"); + archive_read_close(a); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -702,9 +742,14 @@ DEFINE_TEST(test_read_format_zip_xz_multi) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -734,9 +779,14 @@ DEFINE_TEST(test_read_format_zip_xz_multi_blockread) struct archive *a; struct archive_entry *ae; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); @@ -789,9 +839,14 @@ DEFINE_TEST(test_read_format_zip_bz2_hang_on_invalid) struct archive_entry *ae; char buf[8]; + assert((a = archive_read_new()) != NULL); + if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) { + skipping("bzip2 is not fully supported on this platform"); + archive_read_close(a); + return; + } extract_reference_file(refname); - assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -823,3 +878,41 @@ DEFINE_TEST(test_read_format_zip_ppmd8_crash_2) assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); } + +DEFINE_TEST(test_read_format_zip_lzma_alone_leak) +{ + const char *refname = "test_read_format_zip_lzma_alone_leak.zipx"; + struct archive *a; + struct archive_entry *ae; + char buf[64]; + + /* OSSFuzz #14470 sample file. */ + extract_reference_file(refname); + + assert((a = archive_read_new()) != NULL); + if(ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("lzma reading is not fully supported on this platform"); + archive_read_close(a); + return; + } + + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 37)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + + /* Extraction of this file should fail, because the sample file is invalid. + * But it shouldn't crash. */ + assertEqualIntA(a, ARCHIVE_FAILED, archive_read_data(a, buf, sizeof(buf))); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + + /* Extraction of this file should fail, because the sample file is invalid. + * But it shouldn't crash. */ + assertEqualIntA(a, ARCHIVE_FATAL, archive_read_data(a, buf, sizeof(buf))); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); + + /* This testcase shouldn't produce any memory leaks. When running test + * suite under Valgrind or ASan, the test runner won't return with + * exit code 0 in case if a memory leak. */ +} |