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