From ac638c85f3c204b55bd35123e2df884ecd252d77 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Sun, 11 Oct 2009 13:06:44 +0000 Subject: [PATCH] Fixed bug #27504: tcp_enqueue wrongly concatenates segments which are not consecutive when retransmitting unacked segments --- CHANGELOG | 4 ++++ src/core/tcp_out.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 045ccffe..c8513d5f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -43,6 +43,10 @@ HISTORY ++ Bugfixes: + 2009-10-11 Simon Goldschmidt (Jörg Kesten) + * tcp_out.c: Fixed bug #27504: tcp_enqueue wrongly concatenates segments + which are not consecutive when retransmitting unacked segments + 2009-10-09 Simon Goldschmidt * opt.h: Fixed default values of some stats to only be enabled if used Fixes bug #27338: sys_stats is defined when NO_SYS = 1 diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c index ca72d9dc..bef38b26 100644 --- a/src/core/tcp_out.c +++ b/src/core/tcp_out.c @@ -347,7 +347,9 @@ tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len, /* fit within max seg size */ (useg->len + queue->len <= pcb->mss) && /* only concatenate segments with the same options */ - (useg->flags == queue->flags)) { + (useg->flags == queue->flags) && + /* segments are consecutive */ + (ntohl(useg->tcphdr->seqno) + useg->len == ntohl(queue->tcphdr->seqno)) ) { /* Remove TCP header from first segment of our to-be-queued list */ if(pbuf_header(queue->p, -(TCP_HLEN + optlen))) { /* Can we cope with this failing? Just assert for now */