Skip to content

Commit

Permalink
Merge pull request #1491 from antekone/rar5_ossfuzz_30442
Browse files Browse the repository at this point in the history
RAR5 reader: fix invalid memory access in some files
  • Loading branch information
mmatuska committed Feb 7, 2022
1 parent bcc48ee commit 05591dd
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 6 deletions.
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -888,6 +888,7 @@ libarchive_test_EXTRA_DIST=\
libarchive/test/test_read_format_rar5_different_winsize_on_merge.rar.uu \
libarchive/test/test_read_format_rar5_block_size_is_too_small.rar.uu \
libarchive/test/test_read_format_rar5_decode_number_out_of_bounds_read.rar.uu \
libarchive/test/test_read_format_rar5_window_buf_and_size_desync.rar.uu \
libarchive/test/test_read_format_raw.bufr.uu \
libarchive/test/test_read_format_raw.data.gz.uu \
libarchive/test/test_read_format_raw.data.Z.uu \
Expand Down
27 changes: 21 additions & 6 deletions libarchive/archive_read_support_format_rar5.c
Original file line number Diff line number Diff line change
Expand Up @@ -1730,14 +1730,29 @@ static int process_head_file(struct archive_read* a, struct rar5* rar,
}
}

/* If we're currently switching volumes, ignore the new definition of
* window_size. */
if(rar->cstate.switch_multivolume == 0) {
/* Values up to 64M should fit into ssize_t on every
* architecture. */
rar->cstate.window_size = (ssize_t) window_size;
if(rar->cstate.window_size < (ssize_t) window_size &&
rar->cstate.window_buf)
{
/* If window_buf has been allocated before, reallocate it, so
* that its size will match new window_size. */

uint8_t* new_window_buf =
realloc(rar->cstate.window_buf, window_size);

if(!new_window_buf) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_PROGRAMMER,
"Not enough memory when trying to realloc the window "
"buffer.");
return ARCHIVE_FATAL;
}

rar->cstate.window_buf = new_window_buf;
}

/* Values up to 64M should fit into ssize_t on every
* architecture. */
rar->cstate.window_size = (ssize_t) window_size;

if(rar->file.solid > 0 && rar->file.solid_window_size == 0) {
/* Solid files have to have the same window_size across
whole archive. Remember the window_size parameter
Expand Down
17 changes: 17 additions & 0 deletions libarchive/test/test_read_format_rar5.c
Original file line number Diff line number Diff line change
Expand Up @@ -1206,6 +1206,23 @@ DEFINE_TEST(test_read_format_rar5_different_window_size)
EPILOGUE();
}

DEFINE_TEST(test_read_format_rar5_window_buf_and_size_desync)
{
/* oss fuzz 30442 */

char buf[4096];
PROLOGUE("test_read_format_rar5_window_buf_and_size_desync.rar");

/* Return codes of those calls are ignored, because this sample file
* is invalid. However, the unpacker shouldn't produce any SIGSEGV
* errors during processing. */

(void) archive_read_next_header(a, &ae);
while(0 < archive_read_data(a, buf, 46)) {}

EPILOGUE();
}

DEFINE_TEST(test_read_format_rar5_arm_filter_on_window_boundary)
{
char buf[4096];
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
begin 644 test_read_format_rar5_window_buf_and_size_desync.rar
M4F%R(1H'`0`]/-[E`@$`_P$`1#[Z5P("`PL``BXB"?\`!(@B@0`)6.-AF?_1
M^0DI&0GG(F%R(0<:)`!3@"KT`P+G(@O_X[\``#&``(?!!0$$[:L``$.M*E)A
M<B$`O<\>P0";/P1%``A*2DI*2DYQ<6TN9'%*2DI*2DI*``!D<F--``````"Z
MNC*ZNKJZNFYO=&%I;+JZNKJZNKJZOKJZ.KJZNKJZNKKZU@4%````0$!`0$!`
M0$!`0$!`0$!`0$#_________/T#`0$!`0$!`-UM`0$!`0$!`0$!`0$!`0$!`
M0$!`0'!,J+:O!IZ-WN4'@`!3*F0`````````````````````````````````
M``````````````#T`P)287(A&@<!`%.`*O0#`N<B`_,F@`'[__\``(`4`01S
J'`/H/O\H@?\D`#O9GIZ>GN<B"_]%``(``&1RGIZ>GIZ>8_^>GE/_``!.
`
end

0 comments on commit 05591dd

Please sign in to comment.