From 8b292c6dd8efbbf0c2ebea565eeec9177c1d67f2 Mon Sep 17 00:00:00 2001 From: whitequark Date: Wed, 25 Jan 2017 05:36:42 +0000 Subject: [PATCH] Don't switch TCP state from FIN-WAIT-1 to FIN-WAIT-2 with queued data. --- src/socket/tcp.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index c15410d..4fc7b91 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -725,9 +725,12 @@ impl<'a> TcpSocket<'a> { self.retransmit.reset(); } - // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2. + // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2, if we've already + // sent everything in the transmit buffer. (State::FinWait1, TcpRepr { control: TcpControl::None, .. }) => { - self.set_state(State::FinWait2); + if self.tx_buffer.empty() { + self.set_state(State::FinWait2); + } } // FIN packets in FIN-WAIT-1 state change it to CLOSING. @@ -1654,6 +1657,12 @@ mod test { payload: &b"abcdef"[..], ..RECV_TEMPL }]); + send!(s, TcpRepr { + seq_number: REMOTE_SEQ + 1, + ack_number: Some(LOCAL_SEQ + 1 + 6), + ..SEND_TEMPL + }); + assert_eq!(s.state, State::FinWait1); } #[test]