From 9113cb6b071d91b60269403549ae2d4de94e3675 Mon Sep 17 00:00:00 2001 From: Chris Hennick Date: Wed, 28 Feb 2024 17:28:17 -0800 Subject: [PATCH] Bug fix: allow invalid compressed files, but verify length if decompression succeeds --- fuzz/fuzz_targets/fuzz_read.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fuzz/fuzz_targets/fuzz_read.rs b/fuzz/fuzz_targets/fuzz_read.rs index dde824d6..4781d180 100644 --- a/fuzz/fuzz_targets/fuzz_read.rs +++ b/fuzz/fuzz_targets/fuzz_read.rs @@ -2,13 +2,19 @@ use libfuzzer_sys::fuzz_target; use std::io::Read; +const MAX_BYTES_TO_READ: u64 = 1 << 24; + fn decompress_all(data: &[u8]) -> Result<(), Box> { let reader = std::io::Cursor::new(data); let mut zip = zip_next::ZipArchive::new(reader)?; for i in 0..zip.len() { let file = zip.by_index(i)?; - std::io::copy(&mut file.take(1 << 24), &mut std::io::sink())?; + let expected_bytes = file.size().max(MAX_BYTES_TO_READ); + let result = std::io::copy(&mut file.take(MAX_BYTES_TO_READ), &mut std::io::sink()); + if let Ok(bytes) = result { + assert_eq!(expected_bytes, bytes) + } } Ok(())