Skip to content

Commit

Permalink
Merge pull request image-rs#295 from fintelia/fuzz-patch
Browse files Browse the repository at this point in the history
fix fuzz targets
  • Loading branch information
HeroicKatora authored May 6, 2021
2 parents ad64959 + d1e15c7 commit b9a731e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
23 changes: 10 additions & 13 deletions fuzz/fuzz_targets/buf_independent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,33 +50,30 @@ fuzz_target!(|data: &[u8]| {

#[inline(always)]
fn png_compare<R: BufRead, S: BufRead>(reference: png::Decoder<R>, smal: png::Decoder<S>)
-> std::result::Result<png::OutputInfo, ()>
-> std::result::Result<(), ()>
{
let mut smal = Some(smal);
let (info, mut reference) = reference.read_info().map_err(|_| {
let mut reference = reference.read_info().map_err(|_| {
assert!(smal.take().unwrap().read_info().is_err());
})?;

let (sinfo, mut smal) = smal.take().unwrap().read_info().expect("Deviation");
assert_eq!(info, sinfo);
let mut smal = smal.take().unwrap().read_info().expect("Deviation");

if info.buffer_size() > 5_000_000 {
assert_eq!(reference.info().raw_bytes(), smal.info().raw_bytes());
if reference.info().raw_bytes() > 5_000_000 {
return Err(());
}

let mut ref_data = vec![0; info.buffer_size()];
let mut smal_data = vec![0; info.buffer_size()];

use png::DecodingError::*;
let mut ref_data = vec![0; reference.info().raw_bytes()];
let mut smal_data = vec![0; reference.info().raw_bytes()];

loop {
let rref = reference.next_frame(&mut ref_data);
let rsmal = smal.next_frame(&mut smal_data);
match (rref, rsmal) {
(Ok(()), Ok(())) if ref_data == smal_data => {},
(Ok(()), Ok(())) => panic!("Deviating data decoded"),
(Err(Format(fr)), Err(Format(fs))) if fr != fs => panic!("Deviating format errors {} vs {}", fr, fs),
(Err(er), Err(es)) if discriminant(&er) == discriminant(&es) => break Ok(sinfo),
(Ok(info), Ok(sinfo)) if ref_data == smal_data => assert_eq!(info, sinfo),
(Ok(_), Ok(_)) => panic!("Deviating data decoded"),
(Err(er), Err(es)) if discriminant(&er) == discriminant(&es) => break Ok(()),
(Err(ferr), Err(serr)) => panic!("Deviating errors {:?} vs {:?}", ferr, serr),
(Ok(_), Err(err)) => panic!("Small buffer failed {:?}", err),
(Err(err), Ok(_)) => panic!("Unexpected success: {:?}", err),
Expand Down
15 changes: 9 additions & 6 deletions fuzz/fuzz_targets/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,23 @@
extern crate png;

#[inline(always)]
fn png_decode(data: &[u8]) -> Result<(png::OutputInfo, Vec<u8>), ()> {
fn png_decode(data: &[u8]) -> Result<(Option<png::OutputInfo>, Vec<u8>), ()> {
let limits = png::Limits { bytes: 1 << 16 };
let decoder = png::Decoder::new_with_limits(data, limits);
let (info, mut reader) = decoder.read_info().map_err(|_| ())?;
let mut reader = decoder.read_info().map_err(|_| ())?;

if info.buffer_size() > 5_000_000 {
if reader.info().raw_bytes() > 5_000_000 {
return Err(());
}

let mut img_data = vec![0u8; info.buffer_size()];
let mut img_data = vec![0u8; reader.info().raw_bytes()];

while let Ok(_) = reader.next_frame(&mut img_data) {}
let mut last_info = None;
while let Ok(info) = reader.next_frame(&mut img_data) {
last_info = Some(info);
}

Ok((info, img_data))
Ok((last_info, img_data))
}

fuzz_target!(|data: &[u8]| {
Expand Down

0 comments on commit b9a731e

Please sign in to comment.