diff options
Diffstat (limited to 'libarchive/test/test_fuzz.c')
| -rw-r--r-- | libarchive/test/test_fuzz.c | 202 |
1 files changed, 198 insertions, 4 deletions
diff --git a/libarchive/test/test_fuzz.c b/libarchive/test/test_fuzz.c index cd8f7e0d5549..76fda6282fa6 100644 --- a/libarchive/test/test_fuzz.c +++ b/libarchive/test/test_fuzz.c @@ -123,18 +123,21 @@ test_fuzz(const struct files *filesets) continue; image = malloc(size); assert(image != NULL); - if (image == NULL) + if (image == NULL) { + free(rawimage); return; + } srand((unsigned)time(NULL)); - for (i = 0; i < 100; ++i) { + for (i = 0; i < 1000; ++i) { FILE *f; int j, numbytes, trycnt; /* Fuzz < 1% of the bytes in the archive. */ memcpy(image, rawimage, size); q = (int)size / 100; - if (!q) q = 1; + if (q < 4) + q = 4; numbytes = (int)(rand() % q); for (j = 0; j < numbytes; ++j) image[rand() % size] = (char)rand(); @@ -158,6 +161,7 @@ test_fuzz(const struct files *filesets) assertEqualInt((size_t)size, fwrite(image, 1, (size_t)size, f)); fclose(f); + // Try to read all headers and bodies. assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); @@ -173,7 +177,21 @@ test_fuzz(const struct files *filesets) archive_read_close(a); } archive_read_free(a); - } + + // Just list headers, skip bodies. + 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)); + + if (0 == archive_read_open_memory(a, image, size)) { + while(0 == archive_read_next_header(a, &ae)) { + } + archive_read_close(a); + } + archive_read_free(a); +} free(image); free(rawimage); } @@ -212,6 +230,10 @@ DEFINE_TEST(test_fuzz_cpio) NULL }; static const char *fileset2[] = { + "test_read_format_cpio_bin_le.cpio", + NULL + }; + static const char *fileset3[] = { /* Test RPM unwrapper */ "test_read_format_cpio_svr4_gzip_rpm.rpm", NULL @@ -219,6 +241,7 @@ DEFINE_TEST(test_fuzz_cpio) static const struct files filesets[] = { {0, fileset1}, {0, fileset2}, + {0, fileset3}, {1, NULL} }; test_fuzz(filesets); @@ -395,12 +418,183 @@ DEFINE_TEST(test_fuzz_zip) NULL }; static const char *fileset2[] = { + "test_compat_zip_2.zip", + NULL + }; + static const char *fileset3[] = { + "test_compat_zip_3.zip", + NULL + }; + static const char *fileset4[] = { + "test_compat_zip_4.zip", + NULL + }; + static const char *fileset5[] = { + "test_compat_zip_5.zip", + NULL + }; + static const char *fileset6[] = { + "test_compat_zip_6.zip", + NULL + }; + static const char *fileset7[] = { "test_read_format_zip.zip", NULL }; + static const char *fileset8[] = { + "test_read_format_zip_comment_stored_1.zip", + NULL + }; + static const char *fileset9[] = { + "test_read_format_zip_comment_stored_2.zip", + NULL + }; + static const char *fileset10[] = { + "test_read_format_zip_encryption_data.zip", + NULL + }; + static const char *fileset11[] = { + "test_read_format_zip_encryption_header.zip", + NULL + }; + static const char *fileset12[] = { + "test_read_format_zip_encryption_partially.zip", + NULL + }; + static const char *fileset13[] = { + "test_read_format_zip_filename_cp866.zip", + NULL + }; + static const char *fileset14[] = { + "test_read_format_zip_filename_cp932.zip", + NULL + }; + static const char *fileset15[] = { + "test_read_format_zip_filename_koi8r.zip", + NULL + }; + static const char *fileset16[] = { + "test_read_format_zip_filename_utf8_jp.zip", + NULL + }; + static const char *fileset17[] = { + "test_read_format_zip_filename_utf8_ru.zip", + NULL + }; + static const char *fileset18[] = { + "test_read_format_zip_filename_utf8_ru2.zip", + NULL + }; + static const char *fileset19[] = { + "test_read_format_zip_length_at_end.zip", + NULL + }; + static const char *fileset20[] = { + "test_read_format_zip_mac_metadata.zip", + NULL + }; + static const char *fileset21[] = { + "test_read_format_zip_malformed1.zip", + NULL + }; + static const char *fileset22[] = { + "test_read_format_zip_msdos.zip", + NULL + }; + static const char *fileset23[] = { + "test_read_format_zip_nested.zip", + NULL + }; + static const char *fileset24[] = { + "test_read_format_zip_nofiletype.zip", + NULL + }; + static const char *fileset25[] = { + "test_read_format_zip_padded1.zip", + NULL + }; + static const char *fileset26[] = { + "test_read_format_zip_padded2.zip", + NULL + }; + static const char *fileset27[] = { + "test_read_format_zip_padded3.zip", + NULL + }; + static const char *fileset28[] = { + "test_read_format_zip_symlink.zip", + NULL + }; + static const char *fileset29[] = { + "test_read_format_zip_traditional_encryption_data.zip", + NULL + }; + static const char *fileset30[] = { + "test_read_format_zip_ux.zip", + NULL + }; + static const char *fileset31[] = { + "test_read_format_zip_winzip_aes128.zip", + NULL + }; + static const char *fileset32[] = { + "test_read_format_zip_winzip_aes256.zip", + NULL + }; + static const char *fileset33[] = { + "test_read_format_zip_winzip_aes256_large.zip", + NULL + }; + static const char *fileset34[] = { + "test_read_format_zip_winzip_aes256_stored.zip", + NULL + }; + static const char *fileset35[] = { + "test_read_format_zip_zip64a.zip", + NULL + }; + static const char *fileset36[] = { + "test_read_format_zip_zip64b.zip", + NULL + }; + static const struct files filesets[] = { {0, fileset1}, {0, fileset2}, + {0, fileset3}, + {0, fileset4}, + {0, fileset5}, + {0, fileset6}, + {0, fileset7}, + {0, fileset8}, + {0, fileset9}, + {0, fileset10}, + {0, fileset11}, + {0, fileset12}, + {0, fileset13}, + {0, fileset14}, + {0, fileset15}, + {0, fileset16}, + {0, fileset17}, + {0, fileset18}, + {0, fileset19}, + {0, fileset20}, + {0, fileset21}, + {0, fileset22}, + {0, fileset23}, + {0, fileset24}, + {0, fileset25}, + {0, fileset26}, + {0, fileset27}, + {0, fileset28}, + {0, fileset29}, + {0, fileset30}, + {0, fileset31}, + {0, fileset32}, + {0, fileset33}, + {0, fileset34}, + {0, fileset35}, + {0, fileset36}, {1, NULL} }; test_fuzz(filesets); |
