Increase required size for ICMPv4 packets

- Increase the size required in Icmpv4Packet::check_len to 8 bytes
 - Add a test
This commit is contained in:
Dan Robertson 2018-01-18 01:32:00 +00:00 committed by whitequark
parent 3b824ca642
commit 3ff7e07941

View File

@ -208,14 +208,10 @@ impl<T: AsRef<[u8]>> Packet<T> {
/// [set_header_len]: #method.set_header_len /// [set_header_len]: #method.set_header_len
pub fn check_len(&self) -> Result<()> { pub fn check_len(&self) -> Result<()> {
let len = self.buffer.as_ref().len(); let len = self.buffer.as_ref().len();
if len < field::CHECKSUM.end { if len < self.header_len() {
Err(Error::Truncated) Err(Error::Truncated)
} else { } else {
if len < self.header_len() as usize { Ok(())
Err(Error::Truncated)
} else {
Ok(())
}
} }
} }
@ -272,7 +268,7 @@ impl<T: AsRef<[u8]>> Packet<T> {
Message::EchoRequest => field::ECHO_SEQNO.end, Message::EchoRequest => field::ECHO_SEQNO.end,
Message::EchoReply => field::ECHO_SEQNO.end, Message::EchoReply => field::ECHO_SEQNO.end,
Message::DstUnreachable => field::UNUSED.end, Message::DstUnreachable => field::UNUSED.end,
_ => field::CHECKSUM.end // make a conservative assumption _ => field::UNUSED.end // make a conservative assumption
} }
} }
@ -607,4 +603,12 @@ mod test {
repr.emit(&mut packet, &ChecksumCapabilities::default()); repr.emit(&mut packet, &ChecksumCapabilities::default());
assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]); assert_eq!(&packet.into_inner()[..], &ECHO_PACKET_BYTES[..]);
} }
#[test]
fn test_check_len() {
let bytes = [0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00];
assert_eq!(Packet::new_checked(&bytes[..4]), Err(Error::Truncated));
assert!(Packet::new_checked(&bytes[..]).is_ok());
}
} }