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/test_read_format_7zip_malformed.7z.uu | 5 ++ libarchive/test/test_read_format_7zip_malformed.c | 67 ++++++++++++++++++++++ .../test/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 d6e40a2..f6e1e20 100644 --- a/Makefile.am +++ b/Makefile.am @@ -372,6 +372,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_filter_program_signature.c \ libarchive/test/test_read_filter_uudecode.c \ libarchive/test/test_read_format_7zip.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 \ @@ -599,6 +600,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 194b8d5..e490c00 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -1940,7 +1940,16 @@ read_CodersInfo(struct archive_read *a, struct _7z_coders_info *ci) return (-1); if (1000000 < 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 6ac850d..08770d9 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -87,6 +87,7 @@ IF(ENABLE_TEST) test_read_filter_program_signature.c test_read_filter_uudecode.c test_read_format_7zip.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 0000000..179f633 --- /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