* 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
This commit is contained in:
@@ -90,8 +90,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (sequence < fFirstSequence) {
|
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);
|
gBufferModule->remove_header(buffer, fFirstSequence - sequence);
|
||||||
sequence = fFirstSequence;
|
sequence = fFirstSequence;
|
||||||
}
|
}
|
||||||
@@ -121,12 +120,6 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
|
|||||||
if (fLastSequence < sequence + buffer->size)
|
if (fLastSequence < sequence + buffer->size)
|
||||||
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
|
// find the place where to insert the buffer into the queue
|
||||||
|
|
||||||
SegmentList::ReverseIterator iterator = fList.GetReverseIterator();
|
SegmentList::ReverseIterator iterator = fList.GetReverseIterator();
|
||||||
@@ -156,7 +149,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
|
|||||||
gBufferModule->free(previous);
|
gBufferModule->free(previous);
|
||||||
}
|
}
|
||||||
} else if (tcp_sequence(previous->sequence + previous->size)
|
} else if (tcp_sequence(previous->sequence + previous->size)
|
||||||
> sequence + buffer->size) {
|
>= sequence + buffer->size) {
|
||||||
// We already know this data
|
// We already know this data
|
||||||
gBufferModule->free(buffer);
|
gBufferModule->free(buffer);
|
||||||
buffer = NULL;
|
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
|
while (buffer != NULL && next != NULL
|
||||||
&& tcp_sequence(sequence + buffer->size) > next->sequence) {
|
&& tcp_sequence(sequence + buffer->size) > next->sequence) {
|
||||||
// we already have at least part of this data
|
// we already have at least part of this data
|
||||||
|
|||||||
Reference in New Issue
Block a user