Coverage Report

Created: 2026-01-25 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/unsafe-libyaml/fuzz/fuzz_targets/parse.rs
Line
Count
Source
1
#![no_main]
2
3
use libfuzzer_sys::fuzz_target;
4
use std::cmp;
5
use std::ffi::c_void;
6
use std::mem::MaybeUninit;
7
use std::ptr;
8
use std::ptr::addr_of_mut;
9
use unsafe_libyaml::{
10
    yaml_event_delete, yaml_event_t, yaml_parser_delete, yaml_parser_initialize, yaml_parser_parse,
11
    yaml_parser_set_input, yaml_parser_t, YAML_STREAM_END_EVENT,
12
};
13
14
fuzz_target!(|data: &[u8]| unsafe { fuzz_target(data) });
15
16
8.75k
unsafe fn fuzz_target(mut data: &[u8]) {
17
8.75k
    let mut parser = MaybeUninit::<yaml_parser_t>::uninit();
18
8.75k
    let parser = parser.as_mut_ptr();
19
8.75k
    assert!(yaml_parser_initialize(parser).ok);
20
8.75k
    yaml_parser_set_input(parser, read_from_slice, addr_of_mut!(data).cast());
21
22
8.75k
    let mut event = MaybeUninit::<yaml_event_t>::uninit();
23
8.75k
    let event = event.as_mut_ptr();
24
32.7M
    while yaml_parser_parse(parser, event).ok {
25
32.7M
        let type_ = (*event).type_;
26
32.7M
        yaml_event_delete(event);
27
32.7M
        if type_ == YAML_STREAM_END_EVENT {
28
3.22k
            break;
29
32.7M
        }
30
    }
31
8.75k
    yaml_parser_delete(parser);
32
8.75k
}
33
34
29.7k
unsafe fn read_from_slice(
35
29.7k
    data: *mut c_void,
36
29.7k
    buffer: *mut u8,
37
29.7k
    size: u64,
38
29.7k
    size_read: *mut u64,
39
29.7k
) -> i32 {
40
29.7k
    let data = data.cast::<&[u8]>();
41
29.7k
    let input = data.read();
42
29.7k
    let n = cmp::min(input.len(), size as usize);
43
29.7k
    ptr::copy_nonoverlapping(input.as_ptr(), buffer, n);
44
29.7k
    data.write(&input[n..]);
45
29.7k
    *size_read = n as u64;
46
29.7k
    1
47
29.7k
}