/src/mp4parse-rust/mp4parse_capi/fuzz/fuzz_targets/avif.rs
Line | Count | Source |
1 | | #![no_main] |
2 | | use libfuzzer_sys::fuzz_target; |
3 | | |
4 | | use mp4parse_capi::*; |
5 | | use std::convert::TryInto; |
6 | | use std::io::Read; |
7 | | use std::mem::MaybeUninit; |
8 | | |
9 | | type CursorType<'a> = std::io::Cursor<&'a [u8]>; |
10 | | |
11 | 0 | extern "C" fn vec_read(buf: *mut u8, size: usize, userdata: *mut std::os::raw::c_void) -> isize { |
12 | 0 | let input: &mut CursorType = unsafe { &mut *(userdata as *mut _) }; |
13 | | |
14 | 0 | let buf = unsafe { std::slice::from_raw_parts_mut(buf, size) }; |
15 | 0 | match input.read(buf) { |
16 | 0 | Ok(n) => n.try_into().expect("invalid conversion"), |
17 | 0 | Err(_) => -1, |
18 | | } |
19 | 0 | } |
20 | | |
21 | | fuzz_target!(|data: &[u8]| { |
22 | | let mut cursor: CursorType = std::io::Cursor::new(data); |
23 | | let io = Mp4parseIo { |
24 | | read: Some(vec_read), |
25 | | userdata: &mut cursor as *mut _ as *mut std::os::raw::c_void, |
26 | | }; |
27 | | unsafe { |
28 | | let mut context = std::ptr::null_mut(); |
29 | | if mp4parse_avif_new(&io, ParseStrictness::Normal, &mut context) != Mp4parseStatus::Ok { |
30 | | return; |
31 | | } |
32 | | |
33 | | let _info = { |
34 | | let mut info = MaybeUninit::zeroed(); |
35 | | let _ = mp4parse_avif_get_info(&*context, info.as_mut_ptr()); |
36 | | info.assume_init() |
37 | | }; |
38 | | |
39 | | let _ = mp4parse_avif_get_image_safe(&*context); |
40 | | |
41 | | mp4parse_avif_free(context); |
42 | | } |
43 | | }); |