From 88f49e26237af8f9f5c274f97704be43131f43a9 Mon Sep 17 00:00:00 2001 From: Malachi Moody Date: Sat, 8 Aug 2026 13:48:34 -0500 Subject: [PATCH] tests: reproduce invalid CAB LZX history reference --- Makefile.am | 3 ++ libarchive/test/CMakeLists.txt | 1 + ...test_read_format_cab_lzx_invalid_history.c | 45 +++++++++++++++++++ ...read_format_cab_lzx_invalid_history.cab.uu | 6 +++ ...read_format_cab_lzx_literal_control.cab.uu | 6 +++ 5 files changed, 61 insertions(+) create mode 100644 libarchive/test/test_read_format_cab_lzx_invalid_history.c create mode 100644 libarchive/test/test_read_format_cab_lzx_invalid_history.cab.uu create mode 100644 libarchive/test/test_read_format_cab_lzx_literal_control.cab.uu diff --git a/Makefile.am b/Makefile.am index d437f5e5..06e492db 100644 --- a/Makefile.am +++ b/Makefile.am @@ -494,6 +494,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_cab_filename.c \ libarchive/test/test_read_format_cab_lzx_16bit.c \ libarchive/test/test_read_format_cab_lzx_e8.c \ + libarchive/test/test_read_format_cab_lzx_invalid_history.c \ libarchive/test/test_read_format_cab_lzx_oob.c \ libarchive/test/test_read_format_cab_mszip_oob.c \ libarchive/test/test_read_format_cab_multi.c \ @@ -928,6 +929,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_cab_filename_cp932.cab.uu \ libarchive/test/test_read_format_cab_lzx_16bit.cab.uu \ libarchive/test/test_read_format_cab_lzx_e8.cab.uu \ + libarchive/test/test_read_format_cab_lzx_invalid_history.cab.uu \ + libarchive/test/test_read_format_cab_lzx_literal_control.cab.uu \ libarchive/test/test_read_format_cab_lzx_oob.cab.uu \ libarchive/test/test_read_format_cab_multi.p1.cab.uu \ libarchive/test/test_read_format_cab_multi.p2.cab.uu \ diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index 91d537f5..ccba76d0 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -123,6 +123,7 @@ IF(ENABLE_TEST) test_read_format_cab_filename.c test_read_format_cab_lzx_16bit.c test_read_format_cab_lzx_e8.c + test_read_format_cab_lzx_invalid_history.c test_read_format_cab_lzx_oob.c test_read_format_cab_mszip_oob.c test_read_format_cab_multi.c diff --git a/libarchive/test/test_read_format_cab_lzx_invalid_history.c b/libarchive/test/test_read_format_cab_lzx_invalid_history.c new file mode 100644 index 00000000..1cfcb15c --- /dev/null +++ b/libarchive/test/test_read_format_cab_lzx_invalid_history.c @@ -0,0 +1,45 @@ +#include "test.h" + +DEFINE_TEST(test_read_format_cab_lzx_invalid_history) +{ + const char *invalid = "test_read_format_cab_lzx_invalid_history.cab"; + const char *control = "test_read_format_cab_lzx_literal_control.cab"; + struct archive *a; + struct archive_entry *ae; + char buff[2]; + + extract_reference_file(invalid); + extract_reference_file(control); + + /* A match cannot refer to history that has not been produced yet. */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_cab(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, invalid, 10240)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("x", archive_entry_pathname(ae)); + assertEqualInt(2, archive_entry_size(ae)); + assertEqualIntA(a, ARCHIVE_FATAL, + archive_read_data(a, buff, sizeof(buff))); + assertEqualInt(-1, archive_errno(a)); + assertEqualString("LZX decompression failed (-25)", + archive_error_string(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + + /* The corresponding literal-only stream remains valid. */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_cab(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, control, 10240)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("x", archive_entry_pathname(ae)); + assertEqualInt(2, archive_entry_size(ae)); + assertEqualIntA(a, sizeof(buff), + archive_read_data(a, buff, sizeof(buff))); + assertEqualMem("\0\0", buff, sizeof(buff)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_format_cab_lzx_invalid_history.cab.uu b/libarchive/test/test_read_format_cab_lzx_invalid_history.cab.uu new file mode 100644 index 00000000..a6bc436c --- /dev/null +++ b/libarchive/test/test_read_format_cab_lzx_invalid_history.cab.uu @@ -0,0 +1,6 @@ +begin 644 test_read_format_cab_lzx_invalid_history.cab +M35-#1@````!V`````````"P``````````P$!``$`````````/@````$``P\" +M````````````````````>```````,``"```0(@`````````"`````````,``"```0(@`````````"``