]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect: don't register duplicate app inspect engines
authorVictor Julien <vjulien@oisf.net>
Mon, 27 Jan 2025 09:55:46 +0000 (10:55 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 10 Mar 2025 11:23:08 +0000 (12:23 +0100)
src/detect-engine.c

index 153d25d9d0c0ab7d33f1eb22568369723d37ab26..146804d332311fa69a018b48eae9a77ba75e6b7e 100644 (file)
@@ -245,6 +245,21 @@ static void AppLayerInspectEngineRegisterInternal(const char *name, AppProto alp
 void DetectAppLayerInspectEngineRegister(const char *name, AppProto alproto, uint32_t dir,
         int progress, InspectEngineFuncPtr Callback, InspectionBufferGetDataPtr GetData)
 {
+    /* before adding, check that we don't add a duplicate entry, which will
+     * propegate all the way into the packet runtime if allowed. */
+    DetectEngineAppInspectionEngine *t = g_app_inspect_engines;
+    while (t != NULL) {
+        const uint32_t t_direction = t->dir == 0 ? SIG_FLAG_TOSERVER : SIG_FLAG_TOCLIENT;
+        const int sm_list = DetectBufferTypeGetByName(name);
+
+        if (t->sm_list == sm_list && t->alproto == alproto && t_direction == dir &&
+                t->progress == progress && t->v2.Callback == Callback && t->v2.GetData == GetData) {
+            DEBUG_VALIDATE_BUG_ON(1);
+            return;
+        }
+        t = t->next;
+    }
+
     AppLayerInspectEngineRegisterInternal(name, alproto, dir, progress, Callback, GetData, NULL);
 }