From be31970e36cb7fee49d81e8b0455cd3deac84390 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 27 Dec 2006 23:44:05 +0000 Subject: [PATCH] Don't send a second FIN if we receive a FIN while in FIN_WAIT_2 --- src/net/tcp.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/net/tcp.c b/src/net/tcp.c index 9cb2cf7e..1b5f76c0 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -573,13 +573,14 @@ static int tcp_rx_fin ( struct tcp_connection *conn, uint32_t seq ) { if ( ( conn->rcv_ack - seq ) > 0 ) return 0; - /* Mark FIN as received and send our own FIN */ - conn->tcp_state |= ( TCP_STATE_RCVD ( TCP_FIN ) | - TCP_STATE_SENDING ( TCP_FIN ) ); - - /* Acknowledge FIN */ + /* Mark FIN as received and acknowledge it */ + conn->tcp_state |= TCP_STATE_RCVD ( TCP_FIN ); conn->rcv_ack++; + /* If we haven't already sent our FIN, send a FIN */ + if ( ! ( conn->tcp_state & TCP_STATE_ACKED ( TCP_FIN ) ) ) + conn->tcp_state |= TCP_STATE_SENDING ( TCP_FIN ); + /* Break association with application */ tcp_disassociate ( conn );