Fix tcp segment list corruption bug

remotes/origin/master-1.0.x
Victor Julien 16 years ago
parent e6ba571c0b
commit 156b844ccb

@ -1198,9 +1198,10 @@ static int HandleSegmentStartsAfterListSegment(TcpStream *stream,
overlap); overlap);
break; break;
} }
if (end_before == TRUE || end_same == TRUE || handle_beyond == FALSE) if (end_before == TRUE || end_same == TRUE || handle_beyond == FALSE) {
SCReturnInt(1); SCReturnInt(1);
} }
}
SCReturnInt(0); SCReturnInt(0);
} }
@ -1351,6 +1352,10 @@ void StreamTcpReassembleUnPause (TcpSession *ssn, char direction)
(ssn->flags &= ~STREAMTCP_FLAG_PAUSE_TOCLIENT_REASSEMBLY); (ssn->flags &= ~STREAMTCP_FLAG_PAUSE_TOCLIENT_REASSEMBLY);
} }
/**
* \brief Update the stream reassembly upon receiving an ACK packet.
* \todo this function is too long, we need to break it up
*/
int StreamTcpReassembleHandleSegmentUpdateACK (TcpReassemblyThreadCtx *ra_ctx, int StreamTcpReassembleHandleSegmentUpdateACK (TcpReassemblyThreadCtx *ra_ctx,
TcpSession *ssn, TcpStream *stream, TcpSession *ssn, TcpStream *stream,
Packet *p) Packet *p)
@ -1452,7 +1457,8 @@ int StreamTcpReassembleHandleSegmentUpdateACK (TcpReassemblyThreadCtx *ra_ctx,
} }
if (stream->seg_list_tail == seg) if (stream->seg_list_tail == seg)
stream->seg_list_tail = next_seg; stream->seg_list_tail = seg->prev;
seg->flags &= ~SEGMENTTCP_FLAG_PROCESSED; seg->flags &= ~SEGMENTTCP_FLAG_PROCESSED;
StreamTcpSegmentReturntoPool(seg); StreamTcpSegmentReturntoPool(seg);
seg = next_seg; seg = next_seg;
@ -1495,7 +1501,8 @@ int StreamTcpReassembleHandleSegmentUpdateACK (TcpReassemblyThreadCtx *ra_ctx,
} }
if (stream->seg_list_tail == seg) if (stream->seg_list_tail == seg)
stream->seg_list_tail = next_seg; stream->seg_list_tail = seg->prev;
StreamTcpSegmentReturntoPool(seg); StreamTcpSegmentReturntoPool(seg);
seg = next_seg; seg = next_seg;
continue; continue;
@ -1778,7 +1785,8 @@ int StreamTcpReassembleHandleSegmentUpdateACK (TcpReassemblyThreadCtx *ra_ctx,
/* Update seg_list_tail, in case it also points to this segment*/ /* Update seg_list_tail, in case it also points to this segment*/
if (stream->seg_list_tail == seg) if (stream->seg_list_tail == seg)
stream->seg_list_tail = next_seg; stream->seg_list_tail = seg->prev;
SCLogDebug("removing seg %p, seg->next %p", seg, seg->next); SCLogDebug("removing seg %p, seg->next %p", seg, seg->next);
StreamTcpSegmentReturntoPool(seg); StreamTcpSegmentReturntoPool(seg);
} else { } else {

Loading…
Cancel
Save