/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 | | }); |