From d35fa000faad362e53689c38910739c462f77d8a Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Wed, 1 Dec 2021 00:05:46 +0000 Subject: [PATCH] Add a fuzz target for the decoder --- fuzz/Cargo.toml | 6 ++++++ fuzz/fuzz_targets/qoi_decode.rs | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 fuzz/fuzz_targets/qoi_decode.rs diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 6a03228..8d5d839 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -23,3 +23,9 @@ name = "qoi_encode" path = "fuzz_targets/qoi_encode.rs" test = false doc = false + +[[bin]] +name = "qoi_decode" +path = "fuzz_targets/qoi_decode.rs" +test = false +doc = false diff --git a/fuzz/fuzz_targets/qoi_decode.rs b/fuzz/fuzz_targets/qoi_decode.rs new file mode 100644 index 0000000..f01845f --- /dev/null +++ b/fuzz/fuzz_targets/qoi_decode.rs @@ -0,0 +1,37 @@ +#![no_main] +use libfuzzer_sys::fuzz_target; + +fuzz_target!(|input: (u16, u16, bool, &[u8])| { + let (w, h, is_4, data) = input; + let (w, h) = (w % 300, h % 300); + let channels = if is_4 { 4 } else { 3 }; + + let mut vec = vec![ + b'q', + b'o', + b'i', + b'f', + 0, + 0, + (w >> 8) as u8, + (w & 0xff) as u8, + 0, + 0, + (h >> 8) as u8, + (h & 0xff) as u8, + channels, + 0, + ]; + vec.extend(&*data); + vec.extend(&[0, 0, 0, 0]); + + let out = qoi_fast::qoi_decode_to_vec(&vec, channels); + if let Ok((header, out)) = out { + assert_eq!(header.magic, qoi_fast::consts::QOI_MAGIC); + assert_eq!(header.width, w as u32); + assert_eq!(header.height, h as u32); + assert_eq!(header.channels, channels); + assert_eq!(header.colorspace.to_u8(), 0); + assert_eq!(out.len(), w as usize * h as usize * channels as usize); + } +});