diff --git a/CHANGELOG b/CHANGELOG index d0b7ae5c..13ebde2e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -45,6 +45,9 @@ HISTORY ++ Bugfixes: + 2011-09-27: Simon Goldschmidt + * tcp_in.c: fixed bug #28288: Data after FIN in oos queue + 2011-09-27: Simon Goldschmidt * dhcp.c: fixed bug #34406 dhcp_option_hostname() can overflow the pbuf diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index 35289132..565b3d57 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -887,6 +887,8 @@ tcp_receive(struct tcp_pcb *pcb) u16_t new_tot_len; int found_dupack = 0; + LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); + if (flags & TCP_ACK) { right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; @@ -1120,8 +1122,10 @@ tcp_receive(struct tcp_pcb *pcb) } /* If the incoming segment contains data, we must process it - further. */ - if (tcplen > 0) { + further unless the pcb already received a FIN. + (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING, + LAST-ACK and TIME-WAIT: "Ignore the segment text.") */ + if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) { /* This code basically does three things: +) If the incoming segment contains data that is the next