From 0c1404badd90a44ade0e0925ebcd8d0307cae41e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sun, 18 Jan 2009 16:58:04 +0000 Subject: [PATCH] * The check to remove bytes at the beginning happened twice. * There was an off-by-one error that could well be responsible for bug #2594. Haven't tested it yet, though. * Added an extra assert to make sure that "next" is set correctly. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28937 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/protocols/tcp/BufferQueue.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp b/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp index 8e6df5f66e..7b0cecde46 100644 --- a/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/BufferQueue.cpp @@ -90,8 +90,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence) return; } if (sequence < fFirstSequence) { - // Remove the stuff we already have - + // this buffer contains data that is already long gone - trim it gBufferModule->remove_header(buffer, fFirstSequence - sequence); sequence = fFirstSequence; } @@ -121,12 +120,6 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence) if (fLastSequence < sequence + buffer->size) fLastSequence = sequence + buffer->size; - if (fFirstSequence > sequence) { - // this buffer contains data that is already long gone - trim it - gBufferModule->remove_header(buffer, fFirstSequence - sequence); - sequence = fFirstSequence; - } - // find the place where to insert the buffer into the queue SegmentList::ReverseIterator iterator = fList.GetReverseIterator(); @@ -156,7 +149,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence) gBufferModule->free(previous); } } else if (tcp_sequence(previous->sequence + previous->size) - > sequence + buffer->size) { + >= sequence + buffer->size) { // We already know this data gBufferModule->free(buffer); buffer = NULL; @@ -169,6 +162,9 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence) } } + // "next" always starts after the buffer sequence + ASSERT(next == NULL || buffer == NULL || next->sequence > sequence); + while (buffer != NULL && next != NULL && tcp_sequence(sequence + buffer->size) > next->sequence) { // we already have at least part of this data