Browse Source

Fix a crash parsing malformed TCP options.

Found via cargo-fuzz.
whitequark 7 years ago
parent
commit
3f43be8d84
1 changed files with 3 additions and 2 deletions
  1. 3 2
      src/wire/tcp.rs

+ 3 - 2
src/wire/tcp.rs

@@ -514,8 +514,7 @@ impl<'a> TcpOption<'a> {
             }
             kind => {
                 length = *buffer.get(1).ok_or(Error::Truncated)? as usize;
-                if buffer.len() < length { return Err(Error::Truncated) }
-                let data = &buffer[2..length];
+                let data = buffer.get(2..length).ok_or(Error::Truncated)?;
                 match (kind, length) {
                     (field::OPT_END, _) |
                     (field::OPT_NOP, _) =>
@@ -931,6 +930,8 @@ mod test {
                    Err(Error::Truncated));
         assert_eq!(TcpOption::parse(&[0xc, 0x05, 0x01, 0x02]),
                    Err(Error::Truncated));
+        assert_eq!(TcpOption::parse(&[0xc, 0x01]),
+                   Err(Error::Truncated));
         assert_eq!(TcpOption::parse(&[0x2, 0x02]),
                    Err(Error::Malformed));
         assert_eq!(TcpOption::parse(&[0x3, 0x02]),