From b9c17dd1f0a7095c069ee414c539a134415f42b2 Mon Sep 17 00:00:00 2001 From: Simon Goldschmidt Date: Thu, 1 Sep 2011 21:00:11 +0200 Subject: [PATCH] fixed bug #34111 RST for ACK to listening pcb has wrong seqno --- CHANGELOG | 3 +++ src/core/tcp_in.c | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 7cad2831..25f2ccef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -44,6 +44,9 @@ HISTORY ++ Bugfixes: + 2011-09-01: Simon Goldschmidt + * tcp_in.c: fixed bug #34111 RST for ACK to listening pcb has wrong seqno + 2011-08-24: Simon Goldschmidt * inet6.h: fixed bug #34124 struct in6_addr does not conform to the standard diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index 316dc3d9..9d40ec53 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -448,13 +448,18 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) struct tcp_pcb *npcb; err_t rc; + if (flags & TCP_RST) { + /* An incoming RST should be ignored. Return. */ + return ERR_OK; + } + /* In the LISTEN state, we check for incoming SYN segments, creates a new PCB, and responds with a SYN|ACK. */ if (flags & TCP_ACK) { /* For incoming segments with the ACK flag set, respond with a RST. */ LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); - tcp_rst(ackno + 1, seqno + tcplen, ipX_current_dest_addr(), + tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); } else if (flags & TCP_SYN) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest));