Coverage Report

Created: 2026-06-30 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
});