Merge pull request #3258 from uchiha-bug-hunter/mtree-global-set-overread

mtree: fix out-of-bounds read in process_global_set
(cherry picked from commit f0af7530a1)
This commit is contained in:
Dustin L. Howett authored and Martin Matuska committed 2026-07-26 20:19:47 +02:00
1 parent 9bff9c306f
commit 63f4a201df
2 files changed
+33 -1

No files matched your search

@@ -826,7 +826,7 @@ process_global_set(struct archive_read *a,
line = next;
next = line + strcspn(line, " \t\r\n");
eq = strchr(line, '=');
if (eq > next)
if (eq == NULL || eq > next)
len = next - line;
else
len = eq - line;
+32
View File
@@ -878,3 +878,35 @@ DEFINE_TEST(test_read_format_mtree_nano)
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
/*
* A /set line whose value-less keyword (no '=') repeats made
* process_global_set() compute a bogus length and over-read the option
* buffer in remove_option(). Parsing must stay in bounds and succeed.
*/
DEFINE_TEST(test_read_format_mtree_global_set_no_value)
{
static char archive[] =
"#mtree\n"
"/set nochange nochange\n"
"a type=file\n";
struct archive_entry *ae;
struct archive *a;
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));
assertEqualIntA(a, ARCHIVE_OK,
archive_read_open_memory(a, archive, sizeof(archive)));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
assertEqualString(archive_entry_pathname(ae), "a");
assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualInt(1, archive_file_count(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}