diff --git a/CHANGELOG b/CHANGELOG index 63a8aa6b..89778164 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -62,6 +62,9 @@ HISTORY ++ Bugfixes: + 2012-01-21: Simon Goldschmidt + * tcp.c: fixed bug #34636: FIN_WAIT_2 - Incorrect shutdown of TCP pcb + 2012-01-20: Simon Goldschmidt * dhcp.c: fixed bug #35151: DHCP asserts on incoming option lengths diff --git a/src/core/tcp.c b/src/core/tcp.c index 5c9796ee..4a5f0578 100644 --- a/src/core/tcp.c +++ b/src/core/tcp.c @@ -872,10 +872,15 @@ tcp_slowtmr_start: } /* Check if this PCB has stayed too long in FIN-WAIT-2 */ if (pcb->state == FIN_WAIT_2) { - if ((u32_t)(tcp_ticks - pcb->tmr) > - TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); + /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */ + if (pcb->flags & TF_RXCLOSED) { + /* PCB was fully closed (either through close() or SHUT_RDWR): + normal FIN-WAIT timeout handling. */ + if ((u32_t)(tcp_ticks - pcb->tmr) > + TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); + } } }