Coverage Report

Created: 2025-09-27 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mp4parse-rust/mp4parse_capi/fuzz/fuzz_targets/mp4.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
8
type CursorType<'a> = std::io::Cursor<&'a [u8]>;
9
10
8.39M
extern "C" fn vec_read(buf: *mut u8, size: usize, userdata: *mut std::os::raw::c_void) -> isize {
11
8.39M
    let input: &mut CursorType = unsafe { &mut *(userdata as *mut _) };
12
13
8.39M
    let buf = unsafe { std::slice::from_raw_parts_mut(buf, size) };
14
8.39M
    match input.read(buf) {
15
8.39M
        Ok(n) => n.try_into().expect("invalid conversion"),
16
0
        Err(_) => -1,
17
    }
18
8.39M
}
19
20
fuzz_target!(|data: &[u8]| {
21
    let mut cursor: CursorType = std::io::Cursor::new(data);
22
    let io = Mp4parseIo {
23
        read: Some(vec_read),
24
        userdata: &mut cursor as *mut _ as *mut std::os::raw::c_void,
25
    };
26
    unsafe {
27
        let mut context = std::ptr::null_mut();
28
        if mp4parse_new(&io, &mut context) != Mp4parseStatus::Ok {
29
            return;
30
        }
31
32
        let mut frag_info = Default::default();
33
        mp4parse_get_fragment_info(context, &mut frag_info);
34
35
        let mut pssh_info = Default::default();
36
        mp4parse_get_pssh_info(context, &mut pssh_info);
37
38
        let mut count = 0;
39
        mp4parse_get_track_count(context, &mut count);
40
41
        for track in 0..count {
42
            let mut fragmented = 0;
43
            mp4parse_is_fragmented(context, track, &mut fragmented);
44
45
            let mut info = Default::default();
46
            mp4parse_get_track_info(context, track, &mut info);
47
            match info.track_type {
48
                Mp4parseTrackType::Video => {
49
                    let mut video = Mp4parseTrackVideoInfo::default();
50
                    mp4parse_get_track_video_info(context, track, &mut video);
51
                }
52
                Mp4parseTrackType::Audio => {
53
                    let mut audio = Default::default();
54
                    mp4parse_get_track_audio_info(context, track, &mut audio);
55
                }
56
                // No C API for metadata tracks yet.
57
                Mp4parseTrackType::Metadata => {}
58
                // Skip image data - handled by AVIF fuzzer.
59
                Mp4parseTrackType::Picture | Mp4parseTrackType::AuxiliaryVideo => {}
60
            }
61
62
            let mut indices = Default::default();
63
            mp4parse_get_indice_table(context, track, &mut indices);
64
        }
65
        mp4parse_free(context);
66
    }
67
});