/src/image-png/fuzz/fuzz_targets/decode.rs
Line | Count | Source |
1 | | #![no_main] |
2 | | #[macro_use] extern crate libfuzzer_sys; |
3 | | extern crate png; |
4 | | |
5 | | #[inline(always)] |
6 | 7.32k | fn png_decode(data: &[u8]) -> Result<(Option<png::OutputInfo>, Vec<u8>), ()> { |
7 | 7.32k | let limits = png::Limits { bytes: 1 << 16 }; |
8 | 7.32k | let decoder = png::Decoder::new_with_limits(data, limits); |
9 | 7.32k | let mut reader = decoder.read_info().map_err(|_| ())?; |
10 | | |
11 | 4.68k | if reader.info().raw_bytes() > 5_000_000 { |
12 | 74 | return Err(()); |
13 | 4.61k | } |
14 | 4.61k | |
15 | 4.61k | let mut img_data = vec![0u8; reader.info().raw_bytes()]; |
16 | 4.61k | |
17 | 4.61k | let mut last_info = None; |
18 | 22.7k | while let Ok(info) = reader.next_frame(&mut img_data) { |
19 | 18.0k | last_info = Some(info); |
20 | 18.0k | } |
21 | | |
22 | 4.61k | Ok((last_info, img_data)) |
23 | 7.32k | } |
24 | | |
25 | | fuzz_target!(|data: &[u8]| { |
26 | | let _ = png_decode(&data); |
27 | | }); |