Przeglądaj źródła

Don't panic on TCP sequence number wrapping in debug mode.

Kai Lüke 7 lat temu
rodzic
commit
5e2ae22302
2 zmienionych plików z 18 dodań i 2 usunięć
  1. 16 0
      src/socket/tcp.rs
  2. 2 2
      src/wire/tcp.rs

+ 16 - 0
src/socket/tcp.rs

@@ -1482,6 +1482,7 @@ impl<'a> fmt::Write for TcpSocket<'a> {
 
 #[cfg(test)]
 mod test {
+    use core::i32;
     use wire::{IpAddress, IpRepr};
     use wire::{Ipv4Address, IpCidr, Ipv4Repr};
     use super::*;
@@ -2128,6 +2129,21 @@ mod test {
         }]);
     }
 
+    #[test]
+    fn test_established_send_wrap() {
+        let mut s = socket_established();
+        let local_seq_start = TcpSeqNumber(i32::MAX - 1);
+        s.local_seq_no = local_seq_start + 1;
+        s.remote_last_seq = local_seq_start + 1;
+        s.send_slice(b"abc").unwrap();
+        recv!(s, time 1000, Ok(TcpRepr {
+            seq_number: local_seq_start + 1,
+            ack_number: Some(REMOTE_SEQ + 1),
+            payload:    &b"abc"[..],
+            ..RECV_TEMPL
+        }));
+    }
+
     #[test]
     fn test_established_no_ack() {
         let mut s = socket_established();

+ 2 - 2
src/wire/tcp.rs

@@ -51,13 +51,13 @@ impl ops::Sub for SeqNumber {
     type Output = usize;
 
     fn sub(self, rhs: SeqNumber) -> usize {
-        (self.0 - rhs.0) as usize
+        self.0.wrapping_sub(rhs.0) as usize
     }
 }
 
 impl cmp::PartialOrd for SeqNumber {
     fn partial_cmp(&self, other: &SeqNumber) -> Option<cmp::Ordering> {
-        (self.0 - other.0).partial_cmp(&0)
+        self.0.wrapping_sub(other.0).partial_cmp(&0)
     }
 }