|
@@ -128,10 +128,21 @@ pub mod iphc {
|
|
|
pub fn check_len(&self) -> Result<()> {
|
|
|
let buffer = self.buffer.as_ref();
|
|
|
if buffer.len() < 2 {
|
|
|
- Err(Error::Truncated)
|
|
|
- } else {
|
|
|
- Ok(())
|
|
|
+ return Err(Error::Truncated);
|
|
|
}
|
|
|
+
|
|
|
+ let mut offset = self.ip_fields_start()
|
|
|
+ + self.traffic_class_size()
|
|
|
+ + self.next_header_size()
|
|
|
+ + self.hop_limit_size();
|
|
|
+ offset += self.src_address_size();
|
|
|
+ offset += self.dst_address_size();
|
|
|
+
|
|
|
+ if offset as usize > buffer.len() {
|
|
|
+ return Err(Error::Truncated);
|
|
|
+ }
|
|
|
+
|
|
|
+ Ok(())
|
|
|
}
|
|
|
|
|
|
/// Consumes the frame, returning the underlying buffer.
|
|
@@ -797,6 +808,12 @@ pub mod iphc {
|
|
|
1 // The next header field is inlined
|
|
|
};
|
|
|
|
|
|
+ // Hop Limit size
|
|
|
+ len += match self.hop_limit {
|
|
|
+ 255 | 64 | 1 => 0, // We can inline the hop limit
|
|
|
+ _ => 1,
|
|
|
+ };
|
|
|
+
|
|
|
// Add the lenght of the source address
|
|
|
len += if self.src_addr == ipv6::Address::UNSPECIFIED {
|
|
|
0
|
|
@@ -1279,11 +1296,17 @@ pub mod nhc {
|
|
|
/// Returns `Err(Error::Truncated)` if the buffer is too short.
|
|
|
pub fn check_len(&self) -> Result<()> {
|
|
|
let buffer = self.buffer.as_ref();
|
|
|
+
|
|
|
if buffer.is_empty() {
|
|
|
- Err(Error::Truncated)
|
|
|
- } else {
|
|
|
- Ok(())
|
|
|
+ return Err(Error::Truncated);
|
|
|
+ }
|
|
|
+
|
|
|
+ let index = 1 + self.ports_size() + self.checksum_size();
|
|
|
+ if index > buffer.len() {
|
|
|
+ return Err(Error::Truncated);
|
|
|
}
|
|
|
+
|
|
|
+ Ok(())
|
|
|
}
|
|
|
|
|
|
/// Consumes the frame, returning the underlying buffer.
|
|
@@ -1357,7 +1380,7 @@ pub mod nhc {
|
|
|
let data = self.buffer.as_ref();
|
|
|
let start = self.nhc_fields_start();
|
|
|
|
|
|
- 0xf0b0 + (NetworkEndian::read_u16(&data[start..start + 1]) & 0xff)
|
|
|
+ 0xf0b0 + (data[start] & 0xff) as u16
|
|
|
}
|
|
|
_ => unreachable!(),
|
|
|
}
|
|
@@ -1501,10 +1524,14 @@ pub mod nhc {
|
|
|
checksum::data(packet.payload()),
|
|
|
]);
|
|
|
|
|
|
- // TODO(thvdveld): remove the unwrap
|
|
|
- if chk_sum != packet.checksum().unwrap() {
|
|
|
- return Err(Error::Checksum);
|
|
|
- }
|
|
|
+ if let Some(checksum) = packet.checksum() {
|
|
|
+ if chk_sum != checksum {
|
|
|
+ return Err(Error::Checksum);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ net_trace!("Currently we do not support ellided checksums.");
|
|
|
+ return Err(Error::Unrecognized);
|
|
|
+ };
|
|
|
|
|
|
Ok(UdpNhcRepr(UdpRepr {
|
|
|
src_port: packet.src_port(),
|