Coverage Report

Created: 2026-02-18 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/quiche/fuzz/src/packets_posths_server.rs
Line
Count
Source
1
#![no_main]
2
3
#[macro_use]
4
extern crate libfuzzer_sys;
5
6
use std::net::SocketAddr;
7
8
use std::sync::Mutex;
9
use std::sync::Once;
10
use std::sync::OnceLock;
11
12
static CONFIG: OnceLock<Mutex<quiche::Config>> = OnceLock::new();
13
14
static SCID: quiche::ConnectionId<'static> =
15
    quiche::ConnectionId::from_ref(&[0; quiche::MAX_CONN_ID_LEN]);
16
17
static LOG_INIT: Once = Once::new();
18
19
fuzz_target!(|data: &[u8]| {
20
    quiche_fuzz::reset_rand_for_fuzzing();
21
22
    let from: SocketAddr = "127.0.0.1:1234".parse().unwrap();
23
    let to: SocketAddr = "127.0.0.1:4321".parse().unwrap();
24
25
1
    LOG_INIT.call_once(|| env_logger::builder().format_timestamp_nanos().init());
26
27
    let packets = quiche_fuzz::PktsData { data };
28
29
1
    let config = CONFIG.get_or_init(|| {
30
1
        let (crt_path, key_path) = quiche_fuzz::get_cert_path();
31
32
1
        let mut config = quiche::Config::new(quiche::PROTOCOL_VERSION).unwrap();
33
1
        config.load_cert_chain_from_pem_file(&crt_path).unwrap();
34
1
        config.load_priv_key_from_pem_file(&key_path).unwrap();
35
1
        config
36
1
            .set_application_protos(quiche::h3::APPLICATION_PROTOCOL)
37
1
            .unwrap();
38
1
        config.set_initial_max_data(30);
39
1
        config.set_initial_max_stream_data_bidi_local(15);
40
1
        config.set_initial_max_stream_data_bidi_remote(15);
41
1
        config.set_initial_max_stream_data_uni(10);
42
1
        config.set_initial_max_streams_bidi(3);
43
1
        config.set_initial_max_streams_uni(3);
44
45
1
        config.discover_pmtu(true);
46
1
        config.enable_early_data();
47
1
        config.enable_hystart(true);
48
49
1
        Mutex::new(config)
50
1
    });
51
52
    let mut conn =
53
        quiche::accept(&SCID, None, to, from, &mut config.lock().unwrap())
54
            .unwrap();
55
56
    let mut connc = quiche::connect(
57
        Some("quic.tech"),
58
        &SCID,
59
        from,
60
        to,
61
        &mut config.lock().unwrap(),
62
    )
63
    .unwrap();
64
65
    let info = quiche::RecvInfo { from, to };
66
67
    while !conn.is_established() || !connc.is_established() {
68
        let flight = quiche::test_utils::emit_flight(&mut connc).unwrap();
69
        quiche::test_utils::process_flight(&mut conn, flight).unwrap();
70
71
        let flight = quiche::test_utils::emit_flight(&mut conn).unwrap();
72
        quiche::test_utils::process_flight(&mut connc, flight).unwrap();
73
    }
74
75
    let mut h3_conn = None;
76
    for pkt in packets.iter() {
77
        quiche_fuzz::server_process(pkt, &mut conn, &mut h3_conn, info);
78
    }
79
});