chiark / gitweb /
apply MTU to decoded, not encoded, len
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 8 Aug 2021 14:41:12 +0000 (15:41 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 8 Aug 2021 14:41:12 +0000 (15:41 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/slip.rs

index 397aa548aeda73cd0672cc5bb0fe1b271945ca39..b1d6eca91d53c5d8b2324d2723be8fa9b58f88bd 100644 (file)
@@ -66,14 +66,12 @@ where AC: Fn(&[u8]) -> Result<(), PacketError>,
   if packet.len() == 0 {
     throw!(PacketError::Empty)
   }
-  if packet.len() > mtu.sat() {
-    throw!(PacketError::MTU { len: packet.len(), mtu });
-  }
 
   let mut packet: Box<[u8]> = packet.to_owned().into();
   let mut walk: &mut [u8] = &mut packet;
   let mut header = [0u8; HEADER_FOR_ADDR];
   let mut wheader = &mut header[..];
+  let mut escapes = 0;
 
   while let Some((i, was_mime)) = walk.iter().enumerate().find_map(
     |(i,&c)| match c {
@@ -94,6 +92,7 @@ where AC: Fn(&[u8]) -> Result<(), PacketError>,
       };
       let _ = wheader.write(&[c]);
       walk = &mut walk[i+2 ..];
+      escapes += 1;
     } else {
       let _ = wheader.write(&[SLIP_MIME_ESC]);
       walk = &mut walk[i+1 ..];
@@ -103,6 +102,11 @@ where AC: Fn(&[u8]) -> Result<(), PacketError>,
   let wheader_len = wheader.len();
   let header = &header[0.. header.len() - wheader_len];
 
+  let decoded_len = packet.len() - escapes;
+  if decoded_len > mtu.sat() {
+    throw!(PacketError::MTU { len: decoded_len, mtu });
+  }
+
   addr_chk(&header)?;
 
   packet