Skip to content

Commit 2989fa3

Browse files
committed
Fix insufficient length validation in UDP packets.
Found via cargo-fuzz.
1 parent b33d867 commit 2989fa3

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/wire/udp.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,22 @@ impl<T: AsRef<[u8]>> Packet<T> {
4444

4545
/// Ensure that no accessor method will panic if called.
4646
/// Returns `Err(Error::Truncated)` if the buffer is too short.
47+
/// Returns `Err(Error::Malformed)` if the length field has a value smaller
48+
/// than the header length.
4749
///
48-
/// The result of this check is invalidated by calling [set_header_len].
50+
/// The result of this check is invalidated by calling [set_len].
4951
///
50-
/// [set_header_len]: #method.set_header_len
52+
/// [set_len]: #method.set_len
5153
pub fn check_len(&self) -> Result<(), Error> {
52-
let len = self.buffer.as_ref().len();
53-
if len < field::CHECKSUM.end {
54+
let buffer_len = self.buffer.as_ref().len();
55+
if buffer_len < field::CHECKSUM.end {
5456
Err(Error::Truncated)
5557
} else {
56-
if len < self.len() as usize {
58+
let field_len = self.len() as usize;
59+
if buffer_len < field_len {
5760
Err(Error::Truncated)
61+
} else if field_len < field::CHECKSUM.end {
62+
Err(Error::Malformed)
5863
} else {
5964
Ok(())
6065
}
@@ -299,6 +304,14 @@ mod test {
299304
assert_eq!(&packet.into_inner()[..], &PACKET_BYTES[..]);
300305
}
301306

307+
#[test]
308+
fn test_impossible_len() {
309+
let mut bytes = vec![0; 12];
310+
let mut packet = Packet::new(&mut bytes);
311+
packet.set_len(4);
312+
assert_eq!(packet.check_len(), Err(Error::Malformed));
313+
}
314+
302315
fn packet_repr() -> Repr<'static> {
303316
Repr {
304317
src_port: 48896,

0 commit comments

Comments
 (0)