]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect/pcre: avoid infinite loop after negated pcre
authorPhilippe Antoine <pantoine@oisf.net>
Tue, 28 Jan 2025 14:02:45 +0000 (15:02 +0100)
committerVictor Julien <vjulien@oisf.net>
Mon, 17 Mar 2025 09:05:14 +0000 (10:05 +0100)
Ticket: 7526

The usage of negated pcre, followed by other relative payload
content keywords could lead to an infinite loop.

This is because regular (not negated) pcre can test multiple
occurences, but negated pcre should be tried only once.

src/detect-engine-content-inspection.c

index dbc18c298035f6e3315dd8d899fdb11862171cf8..6ccc5e533efbd9b4969eb3550e1215c8e827072d 100644 (file)
@@ -457,7 +457,6 @@ static int DetectEngineContentInspectionInternal(DetectEngineThreadCtx *det_ctx,
             if (r == 0) {
                 goto no_match;
             }
-
             if (!(pe->flags & DETECT_PCRE_RELATIVE_NEXT)) {
                 SCLogDebug("no relative match coming up, so this is a match");
                 goto match;
@@ -478,6 +477,11 @@ static int DetectEngineContentInspectionInternal(DetectEngineThreadCtx *det_ctx,
                 SCReturnInt(-1);
             }
 
+            if (prev_offset == 0) {
+                // This happens for negated PCRE
+                // We do not search for another occurrence of this pcre
+                SCReturnInt(0);
+            }
             det_ctx->buffer_offset = prev_buffer_offset;
             det_ctx->pcre_match_start_offset = prev_offset;
         } while (1);