defrag: (windows) detect more overlaps

pull/2653/head
Jason Ish 8 years ago committed by Victor Julien
parent 7922f9be1b
commit 845e18f25a

@ -672,16 +672,43 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker,
}
break;
case DEFRAG_POLICY_WINDOWS:
if (frag_offset < prev->offset + prev->data_len) {
if (frag_offset >= prev->offset) {
ltrim = prev->offset + prev->data_len - frag_offset;
overlap++;
}
if ((frag_offset < prev->offset) &&
(frag_end > prev->offset + prev->data_len)) {
prev->skip = 1;
overlap++;
}
/* If new fragment fits inside a previous fragment, drop it. */
if (frag_offset + ltrim >= prev->offset + ltrim &&
frag_end <= prev->offset + prev->data_len) {
overlap++;
goto done;
}
/* If new fragment starts before and ends after
* previous fragment, drop the previous fragment. */
if (frag_offset + ltrim < prev->offset + ltrim &&
frag_end > prev->offset + prev->data_len) {
prev->skip = 1;
overlap++;
goto insert;
}
/* Check if new fragment overlaps the end of previous
* fragment, if it does, trim the new fragment.
*
* Old: AAAAAAAA AAAAAAAA AAAAAAAA
* New: BBBBBBBB BBBBBBBB BBBBBBBB
* Res: AAAAAAAA AAAAAAAA AAAAAAAA BBBBBBBB
*/
if (frag_offset + ltrim > prev->offset + prev->ltrim &&
frag_offset + ltrim < prev->offset + prev->data_len) {
ltrim += prev->offset + prev->data_len - frag_offset;
overlap++;
goto insert;
}
/* If new fragment starts at same offset as an
* existing fragment, but ends after it, trim the new
* fragment. */
if (frag_offset + ltrim == prev->offset + ltrim &&
frag_end > prev->offset + prev->data_len) {
ltrim += prev->offset + prev->data_len - frag_offset;
overlap++;
goto insert;
}
break;
@ -1735,7 +1762,7 @@ static int IPV6DefragSturgesNovakLinuxTest(void)
PASS;
}
static int DefragSturgesNovakWindowsTest(void)
static int DefragSturgesNovakWindowsIpv4Test(void)
{
/* Expected data. */
u_char expected[] = {
@ -2411,8 +2438,8 @@ void DefragRegisterTests(void)
UtRegisterTest("DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
UtRegisterTest("DefragSturgesNovakLinuxIpv4Test",
DefragSturgesNovakLinuxIpv4Test);
UtRegisterTest("DefragSturgesNovakWindowsTest",
DefragSturgesNovakWindowsTest);
UtRegisterTest("DefragSturgesNovakWindowsIpv4Test",
DefragSturgesNovakWindowsIpv4Test);
UtRegisterTest("DefragSturgesNovakSolarisTest",
DefragSturgesNovakSolarisTest);
UtRegisterTest("DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);

Loading…
Cancel
Save