Skip to content

Commit 51c823a

Browse files
committed
Cherry-pick commits from libarchive to vendor/libarchive
CTSRD-CHERI#2148 fix: OOB in rar delta filter (a1cb648d5) CTSRD-CHERI#2149 fix: OOB in rar audio filter (3006bc5d0) CTSRD-CHERI#2150 xar: Fix another infinite loop and expat error handling (b910cb70d) Obtained from: libarchive Libarchive commits: b910cb70d4c1b311c9d85cd536a6c91647c43df7 a1cb648d52f5b6d3f31184d9b6a7cbca628459b7 3006bc5d02ad3ae3c4f9274f60c1f9d2d834734b
1 parent d6f77d3 commit 51c823a

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

libarchive/archive_read_support_format_rar.c

+15
Original file line numberDiff line numberDiff line change
@@ -3612,7 +3612,15 @@ execute_filter_delta(struct rar_filter *filter, struct rar_virtual_machine *vm)
36123612
{
36133613
uint8_t lastbyte = 0;
36143614
for (idx = i; idx < length; idx += numchannels)
3615+
{
3616+
/*
3617+
* The src block should not overlap with the dst block.
3618+
* If so it would be better to consider this archive is broken.
3619+
*/
3620+
if (src >= dst)
3621+
return 0;
36153622
lastbyte = dst[idx] = lastbyte - *src++;
3623+
}
36163624
}
36173625

36183626
filter->filteredblockaddress = length;
@@ -3714,6 +3722,13 @@ execute_filter_audio(struct rar_filter *filter, struct rar_virtual_machine *vm)
37143722
memset(&state, 0, sizeof(state));
37153723
for (j = i; j < length; j += numchannels)
37163724
{
3725+
/*
3726+
* The src block should not overlap with the dst block.
3727+
* If so it would be better to consider this archive is broken.
3728+
*/
3729+
if (src >= dst)
3730+
return 0;
3731+
37173732
int8_t delta = (int8_t)*src++;
37183733
uint8_t predbyte, byte;
37193734
int prederror;

libarchive/archive_read_support_format_xar.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -2055,9 +2055,10 @@ xml_start(struct archive_read *a, const char *name, struct xmlattr_list *list)
20552055
attr = attr->next) {
20562056
if (strcmp(attr->name, "link") != 0)
20572057
continue;
2058-
if (xar->file->hdnext != NULL || xar->file->link != 0) {
2058+
if (xar->file->hdnext != NULL || xar->file->link != 0 ||
2059+
xar->file == xar->hdlink_orgs) {
20592060
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
2060-
"File with multiple link targets");
2061+
"File with multiple link attributes");
20612062
return (ARCHIVE_FATAL);
20622063
}
20632064
if (strcmp(attr->value, "original") == 0) {
@@ -3256,6 +3257,9 @@ expat_start_cb(void *userData, const XML_Char *name, const XML_Char **atts)
32563257
struct xmlattr_list list;
32573258
int r;
32583259

3260+
if (ud->state != ARCHIVE_OK)
3261+
return;
3262+
32593263
r = expat_xmlattr_setup(a, &list, atts);
32603264
if (r == ARCHIVE_OK)
32613265
r = xml_start(a, (const char *)name, &list);

libarchive/test/test_read_format_xar_doublelink.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ DEFINE_TEST(test_read_format_xar_doublelink)
4747

4848
assertA(ARCHIVE_FATAL == archive_read_next_header(a, &ae));
4949
assertEqualString(archive_error_string(a),
50-
"File with multiple link targets");
50+
"File with multiple link attributes");
5151
assert(archive_errno(a) != 0);
5252

5353
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));

0 commit comments

Comments
 (0)