Переглянути джерело

Reject all TCP packets in the CLOSED state.

whitequark 8 роки тому
батько
коміт
9570d66f77
1 змінених файлів з 14 додано та 0 видалено
  1. 14 0
      src/socket/tcp.rs

+ 14 - 0
src/socket/tcp.rs

@@ -542,6 +542,8 @@ impl<'a> TcpSocket<'a> {
     /// See [Socket::process](enum.Socket.html#method.process).
     pub fn process(&mut self, _timestamp: u64, ip_repr: &IpRepr,
                    payload: &[u8]) -> Result<(), Error> {
+        if self.state == State::Closed { return Err(Error::Rejected) }
+
         if ip_repr.protocol() != IpProtocol::Tcp { return Err(Error::Rejected) }
 
         let packet = try!(TcpPacket::new(&payload[..ip_repr.payload_len()]));
@@ -1122,6 +1124,18 @@ mod test {
         }, Err(Error::Rejected));
     }
 
+    #[test]
+    fn test_closed_reject_after_listen() {
+        let mut s = socket();
+        s.listen(LOCAL_END).unwrap();
+        s.close();
+
+        send!(s, TcpRepr {
+            control: TcpControl::Syn,
+            ..SEND_TEMPL
+        }, Err(Error::Rejected));
+    }
+
     #[test]
     fn test_closed_close() {
         let mut s = socket();