From 6d2c11fb61a71f2d147d3ded2f623778523bb945 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 20 Dec 2016 00:17:29 +0000 Subject: [PATCH] Fix IP checksum calculation for odd-length packets. --- src/wire/ip.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/wire/ip.rs b/src/wire/ip.rs index 07da2b8..d1652f5 100644 --- a/src/wire/ip.rs +++ b/src/wire/ip.rs @@ -107,7 +107,12 @@ pub mod checksum { pub fn data(data: &[u8]) -> u16 { let mut accum: u32 = 0; for i in (0..data.len()).step_by(2) { - let word = NetworkEndian::read_u16(&data[i..i + 2]) as u32; + let word; + if i + 2 <= data.len() { + word = NetworkEndian::read_u16(&data[i..i + 2]) as u32 + } else { + word = (data[i] as u32) << 8 + } accum += word; } (((accum >> 16) as u16) + (accum as u16))