From d094dc02905605ca514baf87855f026b9bf52f1f Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Sun, 8 Feb 2015 13:29:51 -0800 Subject: [PATCH] Issue 405: segfault on malformed 7z archive Reject a couple of nonsensical cases. --- Makefile.am | 3 + libarchive/archive_read_support_format_7zip.c | 9 +++ libarchive/test/CMakeLists.txt | 1 + .../test_read_format_7zip_malformed.7z.uu | 5 ++ .../test/test_read_format_7zip_malformed.c | 67 +++++++++++++++++++ .../test_read_format_7zip_malformed2.7z.uu | 5 ++ 6 files changed, 90 insertions(+) create mode 100644 libarchive/test/test_read_format_7zip_malformed.7z.uu create mode 100644 libarchive/test/test_read_format_7zip_malformed.c create mode 100644 libarchive/test/test_read_format_7zip_malformed2.7z.uu diff --git a/Makefile.am b/Makefile.am index b3bfd67ad..2e2755778 100644 --- a/Makefile.am +++ b/Makefile.am @@ -404,6 +404,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_7zip_encryption_data.c \ libarchive/test/test_read_format_7zip_encryption_partially.c \ libarchive/test/test_read_format_7zip_encryption_header.c \ + libarchive/test/test_read_format_7zip_malformed.c \ libarchive/test/test_read_format_ar.c \ libarchive/test/test_read_format_cab.c \ libarchive/test/test_read_format_cab_filename.c \ @@ -677,6 +678,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_7zip_lzma1_2.7z.uu \ libarchive/test/test_read_format_7zip_lzma1_lzma2.7z.uu \ libarchive/test/test_read_format_7zip_lzma2.7z.uu \ + libarchive/test/test_read_format_7zip_malformed.7z.uu \ + libarchive/test/test_read_format_7zip_malformed2.7z.uu \ libarchive/test/test_read_format_7zip_ppmd.7z.uu \ libarchive/test/test_read_format_7zip_symbolic_name.7z.uu \ libarchive/test/test_read_format_ar.ar.uu \ diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c index 2183d8c8b..af267d043 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -2038,7 +2038,16 @@ read_CodersInfo(struct archive_read *a, struct _7z_coders_info *ci) return (-1); if (UMAX_ENTRY < ci->dataStreamIndex) return (-1); + if (ci->numFolders > 0) { + archive_set_error(&a->archive, -1, + "Malformed 7-Zip archive"); + goto failed; + } break; + default: + archive_set_error(&a->archive, -1, + "Malformed 7-Zip archive"); + goto failed; } if ((p = header_bytes(a, 1)) == NULL) diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index 366022f3b..aa639b423 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -94,6 +94,7 @@ IF(ENABLE_TEST) test_read_format_7zip_encryption_data.c test_read_format_7zip_encryption_header.c test_read_format_7zip_encryption_partially.c + test_read_format_7zip_malformed.c test_read_format_ar.c test_read_format_cab.c test_read_format_cab_filename.c diff --git a/libarchive/test/test_read_format_7zip_malformed.7z.uu b/libarchive/test/test_read_format_7zip_malformed.7z.uu new file mode 100644 index 000000000..179f633f9 --- /dev/null +++ b/libarchive/test/test_read_format_7zip_malformed.7z.uu @@ -0,0 +1,5 @@ +begin 644 test_read_format_7zip_malformed.7z +M-WJ\KR<<,#"@P/<&!P````````!(`````````&:^$Y