]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
ipv6: simpler generic overlap condition
authorPhilippe Antoine <contact@catenacyber.fr>
Fri, 10 Sep 2021 12:16:57 +0000 (14:16 +0200)
committerVictor Julien <victor@inliniac.net>
Tue, 5 Oct 2021 10:25:52 +0000 (12:25 +0200)
This also changes the behavior, as the condition is checked in
every case cf ipv6-malformed-fragments-8

(cherry picked from commit 3a230c2208046d001b386979663a6c565691794b)

src/defrag.c

index 0051eaa3170c366e3bd0e3100d77c321c3c8d877..8bda7230d24d3e13df7dfa062ebc7100d4d3d0cd 100644 (file)
@@ -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;
                 }