Files
craft-libs/crates/jpeg/fuzz/fuzz_targets/decode.rs

30 lines
964 B
Rust

#![no_main]
use craft_jpeg::{Limits, Samples, decode, frame};
use libfuzzer_sys::fuzz_target;
fn fuzz_limits() -> Limits {
let mut limits = Limits::default();
limits.max_pixels = 1 << 20;
limits.max_alloc = 64 << 20;
limits
}
fuzz_target!(|data: &[u8]| {
let limits = fuzz_limits();
let _ = frame(data);
// The input length picks the Adobe transform, so every color path is reached without
// changing the stream.
let adobe = [None, Some(0), Some(1), Some(2)][data.len() % 4];
if let Ok(img) = decode(data, &limits, adobe) {
let pixels = u64::from(img.width) * u64::from(img.height);
let (len, width) = match &img.samples {
Samples::U8(v) => (v.len() as u64, 1),
Samples::U16(v) => (v.len() as u64, 2),
};
assert!(pixels <= limits.max_pixels);
assert!(len * width <= limits.max_alloc);
assert_eq!(len, pixels * u64::from(img.components));
}
});