fixed a critical issue with TCP's FIN handling: if FIN was set on a packet with data, fReceiveNext would be rewritten with the queue's LastSeuence which would be effectively the required sequence - 1. Increment instead fReceiveNext with the buffer's size.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20571 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1017,7 +1017,7 @@ TCPEndpoint::Receive(tcp_segment_header &segment, net_buffer *buffer)
|
||||
|
||||
if (buffer->size > 0) {
|
||||
fReceiveQueue.Add(buffer, segment.sequence);
|
||||
fReceiveNext = fReceiveQueue.NextSequence();
|
||||
fReceiveNext += buffer->size;
|
||||
TRACE("Receive(): adding data, receive next = %lu!", (uint32)fReceiveNext);
|
||||
|
||||
release_sem_etc(fReceiveLock, 1, B_DO_NOT_RESCHEDULE);
|
||||
@@ -1027,7 +1027,7 @@ TCPEndpoint::Receive(tcp_segment_header &segment, net_buffer *buffer)
|
||||
gBufferModule->free(buffer);
|
||||
|
||||
if (segment.flags & TCP_FLAG_PUSH)
|
||||
fReceiveQueue.SetPushPointer(fReceiveNext);
|
||||
fReceiveQueue.SetPushPointer(fReceiveQueue.LastSequence());
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user