Merge pull request #1493 from antekone/rar5_ossfuzz_30459
RAR5 reader: add more checks for invalid extraction parameters
This commit is contained in:
1 parent
05591dd516
commit
e346721205
4 files changed
+37
No files matched your search
@@ -889,6 +889,7 @@ libarchive_test_EXTRA_DIST=\
|
||||
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_rar5_bad_window_sz_in_mltarc_file.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 \
|
||||
|
||||
@@ -3631,6 +3631,16 @@ static int do_uncompress_file(struct archive_read* a) {
|
||||
rar->cstate.initialized = 1;
|
||||
}
|
||||
|
||||
/* Don't allow extraction if window_size is invalid. */
|
||||
if(rar->cstate.window_size == 0) {
|
||||
archive_set_error(&a->archive,
|
||||
ARCHIVE_ERRNO_FILE_FORMAT,
|
||||
"Invalid window size declaration in this file");
|
||||
|
||||
/* This should never happen in valid files. */
|
||||
return ARCHIVE_FATAL;
|
||||
}
|
||||
|
||||
if(rar->cstate.all_filters_applied == 1) {
|
||||
/* We use while(1) here, but standard case allows for just 1
|
||||
* iteration. The loop will iterate if process_block() didn't
|
||||
|
||||
@@ -1305,3 +1305,22 @@ DEFINE_TEST(test_read_format_rar5_decode_number_out_of_bounds_read)
|
||||
|
||||
EPILOGUE();
|
||||
}
|
||||
|
||||
DEFINE_TEST(test_read_format_rar5_bad_window_size_in_multiarchive_file)
|
||||
{
|
||||
/* oss fuzz 30459 */
|
||||
|
||||
char buf[4096];
|
||||
PROLOGUE("test_read_format_rar5_bad_window_sz_in_mltarc_file.rar");
|
||||
|
||||
/* This file is damaged, so those functions should return failure.
|
||||
* Additionally, SIGSEGV shouldn't be raised during execution
|
||||
* of those functions. */
|
||||
|
||||
(void) archive_read_next_header(a, &ae);
|
||||
while(0 < archive_read_data(a, buf, sizeof(buf))) {}
|
||||
(void) archive_read_next_header(a, &ae);
|
||||
while(0 < archive_read_data(a, buf, sizeof(buf))) {}
|
||||
|
||||
EPILOGUE();
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
begin 644 test_read_format_rar5_bad_window_size_in_multiarchive_file.rar
|
||||
M4F%R(1H'`0`]/-[E`@$`_R`@1#[Z5P("`PL`("`@@"(`"?\@("#___\@("`@
|
||||
M("`@("`@("`@4X`J]`,"YR(#$($@("`@``$@("`@@<L0("`@("`@("`@("`@
|
||||
M("`@(""LCTJA`P$%`B`@`2!3@"KT`P+G(@,@("`@_P,!!B`@(/___R`@(('+
|
||||
5$"`OX2`@[.SL[.S_("`@("`@("`@
|
||||
`
|
||||
end
|
||||
Reference in new issue
Block a user