Skip to content

Commit 858968b

Browse files
author
Alexandra Sandulescu
committed
fuzz: DHCP header parser
1 parent 2dfc159 commit 858968b

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

fuzz/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,9 @@ name = "tcp_headers"
2828
path = "fuzz_targets/tcp_headers.rs"
2929
test = false
3030
doc = false
31+
32+
[[bin]]
33+
name = "dhcp_header"
34+
path = "fuzz_targets/dhcp_header.rs"
35+
test = false
36+
doc = false

fuzz/fuzz_targets/dhcp_header.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#![no_main]
2+
use libfuzzer_sys::fuzz_target;
3+
use smoltcp::wire::{DhcpPacket, DhcpRepr};
4+
5+
fuzz_target!(|data: &[u8]| {
6+
let _ = match DhcpPacket::new_checked(data) {
7+
Ok(ref packet) => match DhcpRepr::parse(packet) {
8+
Ok(dhcp_repr) => {
9+
let mut dhcp_payload = vec![0; dhcp_repr.buffer_len()];
10+
match DhcpPacket::new_checked(&mut dhcp_payload[..]) {
11+
Ok(mut dhcp_packet) => Some(dhcp_repr.emit(&mut dhcp_packet)),
12+
Err(_) => None,
13+
}
14+
}
15+
Err(_) => None,
16+
},
17+
Err(_) => None,
18+
};
19+
});

src/wire/dhcpv4.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,11 @@ impl<'a> Repr<'a> {
824824
data,
825825
} => {
826826
let mut servers = [None; MAX_DNS_SERVER_COUNT];
827-
for (server, chunk) in servers.iter_mut().zip(data.chunks(4)) {
827+
let chunk_size = 4;
828+
for (server, chunk) in servers.iter_mut().zip(data.chunks(chunk_size)) {
829+
if chunk.len() != chunk_size {
830+
return Err(Error::Malformed);
831+
}
828832
*server = Some(Ipv4Address::from_bytes(chunk));
829833
}
830834
dns_servers = Some(servers);

0 commit comments

Comments
 (0)