]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect: free all tenant detect engines
authorVictor Julien <vjulien@oisf.net>
Tue, 8 Aug 2023 13:50:53 +0000 (15:50 +0200)
committerJeff Lucovsky <jlucovsky@oisf.net>
Sun, 28 Jan 2024 13:40:52 +0000 (08:40 -0500)
Free all tenants registered in the master.

(cherry picked from commit a4d80bc7c4910170aba950db0a497124712b330a)

src/detect-engine.c
src/detect-engine.h
src/suricata.c

index 2a3c7f4c76484672aef4b4cdc57ab40d7f038b64..528afb0568e5ac458fdf2e2ad342a759a01abc72 100644 (file)
@@ -3983,14 +3983,10 @@ int DetectEngineAddToMaster(DetectEngineCtx *de_ctx)
     return r;
 }
 
-int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx)
+static int DetectEngineMoveToFreeListNoLock(DetectEngineMasterCtx *master, DetectEngineCtx *de_ctx)
 {
-    DetectEngineMasterCtx *master = &g_master_de_ctx;
-
-    SCMutexLock(&master->lock);
     DetectEngineCtx *instance = master->list;
     if (instance == NULL) {
-        SCMutexUnlock(&master->lock);
         return -1;
     }
 
@@ -4013,7 +4009,6 @@ int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx)
             instance = next;
         }
         if (instance == NULL) {
-            SCMutexUnlock(&master->lock);
             return -1;
         }
     }
@@ -4029,9 +4024,17 @@ int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx)
         master->free_list = instance;
     }
     SCLogDebug("detect engine %p moved to free list (%u refs)", de_ctx, de_ctx->ref_cnt);
+    return 0;
+}
 
+int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx)
+{
+    int ret = 0;
+    DetectEngineMasterCtx *master = &g_master_de_ctx;
+    SCMutexLock(&master->lock);
+    ret = DetectEngineMoveToFreeListNoLock(master, de_ctx);
     SCMutexUnlock(&master->lock);
-    return 0;
+    return ret;
 }
 
 void DetectEnginePruneFreeList(void)
@@ -4064,6 +4067,24 @@ void DetectEnginePruneFreeList(void)
     SCMutexUnlock(&master->lock);
 }
 
+void DetectEngineClearMaster(void)
+{
+    DetectEngineMasterCtx *master = &g_master_de_ctx;
+    SCMutexLock(&master->lock);
+
+    DetectEngineCtx *instance = master->list;
+    while (instance) {
+        DetectEngineCtx *next = instance->next;
+        DEBUG_VALIDATE_BUG_ON(instance->ref_cnt);
+        SCLogDebug("detect engine %p has %u ref(s)", instance, instance->ref_cnt);
+        instance->ref_cnt = 0;
+        DetectEngineMoveToFreeListNoLock(master, instance);
+        instance = next;
+    }
+    SCMutexUnlock(&master->lock);
+    DetectEnginePruneFreeList();
+}
+
 static int reloads = 0;
 
 /** \brief Reload the detection engine
index 5d58151d0c2cc44c6706f271cd44b140bcde7556..967228bf0b8ba3b9b66213216937b4edb314fa54 100644 (file)
@@ -95,6 +95,7 @@ DetectEngineCtx *DetectEngineGetCurrent(void);
 DetectEngineCtx *DetectEngineGetByTenantId(uint32_t tenant_id);
 void DetectEnginePruneFreeList(void);
 int DetectEngineMoveToFreeList(DetectEngineCtx *de_ctx);
+void DetectEngineClearMaster(void);
 DetectEngineCtx *DetectEngineReference(DetectEngineCtx *);
 void DetectEngineDeReference(DetectEngineCtx **de_ctx);
 int DetectEngineReload(const SCInstance *suri);
index 6b1a5b4d667e10917ea98c107c6406cf9ea1dcc2..a4ef7f56094489c5346523dfbae8275e3a603020 100644 (file)
@@ -402,7 +402,7 @@ static void GlobalsDestroy(SCInstance *suri)
         DetectEngineMoveToFreeList(de_ctx);
         DetectEngineDeReference(&de_ctx);
     }
-    DetectEnginePruneFreeList();
+    DetectEngineClearMaster();
 
     AppLayerDeSetup();
     DatasetsSave();