From: Philippe Antoine Date: Fri, 10 Sep 2021 12:16:57 +0000 (+0200) Subject: ipv6: simpler generic overlap condition X-Git-Tag: suricata-6.0.4~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c8587393d6ebc569b89f22cba0bf1be7efd90c2;p=thirdparty%2Fsuricata.git ipv6: simpler generic overlap condition This also changes the behavior, as the condition is checked in every case cf ipv6-malformed-fragments-8 (cherry picked from commit 3a230c2208046d001b386979663a6c565691794b) --- diff --git a/src/defrag.c b/src/defrag.c index 0051eaa317..8bda7230d2 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -630,7 +630,7 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, tracker->timeout.tv_usec = p->ts.tv_usec; Frag *prev = NULL, *next = NULL; - int overlap = 0; + bool overlap = false; ltrim = 0; if (!RB_EMPTY(&tracker->fragment_tree)) { @@ -652,22 +652,22 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, if (prev->skip) { goto next; } + if (frag_offset < prev->offset + prev->data_len && prev->offset < frag_end) { + overlap = true; + } switch (tracker->policy) { case DEFRAG_POLICY_BSD: if (frag_offset < prev->offset + prev->data_len) { if (frag_offset >= prev->offset) { ltrim = prev->offset + prev->data_len - frag_offset; - overlap++; } if ((next != NULL) && (frag_end > next->offset)) { next->ltrim = frag_end - next->offset; - overlap++; } if ((frag_offset < prev->offset) && (frag_end >= prev->offset + prev->data_len)) { prev->skip = 1; - overlap++; } goto insert; } @@ -683,7 +683,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, if (prev->offset + prev->ltrim < frag_offset + ltrim && prev->offset + prev->data_len > frag_offset + ltrim) { ltrim += prev->offset + prev->data_len - frag_offset; - overlap++; } /* Check if new fragment overlaps the beginning of @@ -697,7 +696,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, if (frag_offset + ltrim < prev->offset + prev->ltrim && frag_end > prev->offset + prev->ltrim) { prev->ltrim += frag_end - (prev->offset + prev->ltrim); - overlap++; goto insert; } @@ -717,7 +715,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, /* 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; } @@ -726,7 +723,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, if (frag_offset + ltrim < prev->offset + ltrim && frag_end > prev->offset + prev->data_len) { prev->skip = 1; - overlap++; goto insert; } @@ -740,7 +736,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, 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; } @@ -750,7 +745,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, 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; @@ -758,12 +752,10 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, 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++; } goto insert; } @@ -771,7 +763,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, case DEFRAG_POLICY_FIRST: if ((frag_offset >= prev->offset) && (frag_end <= prev->offset + prev->data_len)) { - overlap++; goto done; } if (frag_offset < prev->offset) { @@ -779,7 +770,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, } if (frag_offset < prev->offset + prev->data_len) { ltrim = prev->offset + prev->data_len - frag_offset; - overlap++; goto insert; } break; @@ -787,7 +777,6 @@ DefragInsertFrag(ThreadVars *tv, DecodeThreadVars *dtv, DefragTracker *tracker, if (frag_offset <= prev->offset) { if (frag_end > prev->offset) { prev->ltrim = frag_end - prev->offset; - overlap++; } goto insert; }