]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
detect/multi-tenant: address various thread safety warnings
authorVictor Julien <vjulien@oisf.net>
Sat, 21 Jun 2025 18:54:16 +0000 (20:54 +0200)
committerVictor Julien <vjulien@oisf.net>
Sun, 22 Jun 2025 09:35:38 +0000 (11:35 +0200)
src/detect-engine.c
src/detect-engine.h

index b70f01da5804a8d318d7bb6a3a75c69c333e606a..b5fe6dbf1ec71f4e3981df64e43c4ddad22175e9 100644 (file)
@@ -3155,16 +3155,18 @@ static void DetectEngineThreadCtxDeinitKeywords(DetectEngineCtx *de_ctx, DetectE
 static TmEcode DetectEngineThreadCtxInitForMT(ThreadVars *tv, DetectEngineThreadCtx *det_ctx)
 {
     DetectEngineMasterCtx *master = &g_master_de_ctx;
+    SCMutexLock(&master->lock);
+
     DetectEngineTenantMapping *map_array = NULL;
     uint32_t map_array_size = 0;
     uint32_t map_cnt = 0;
     uint32_t max_tenant_id = 0;
     DetectEngineCtx *list = master->list;
-    HashTable *mt_det_ctxs_hash = NULL;
 
     if (master->tenant_selector == TENANT_SELECTOR_UNKNOWN) {
         SCLogError("no tenant selector set: "
                    "set using multi-detect.selector");
+        SCMutexUnlock(&master->lock);
         return TM_ECODE_FAILED;
     }
 
@@ -3177,7 +3179,8 @@ static TmEcode DetectEngineThreadCtxInitForMT(ThreadVars *tv, DetectEngineThread
         tcnt++;
     }
 
-    mt_det_ctxs_hash = HashTableInit(tcnt * 2, TenantIdHash, TenantIdCompare, TenantIdFree);
+    HashTable *mt_det_ctxs_hash =
+            HashTableInit(tcnt * 2, TenantIdHash, TenantIdCompare, TenantIdFree);
     if (mt_det_ctxs_hash == NULL) {
         goto error;
     }
@@ -3257,6 +3260,7 @@ static TmEcode DetectEngineThreadCtxInitForMT(ThreadVars *tv, DetectEngineThread
             break;
     }
 
+    SCMutexUnlock(&master->lock);
     return TM_ECODE_OK;
 error:
     if (map_array != NULL)
@@ -3264,6 +3268,7 @@ error:
     if (mt_det_ctxs_hash != NULL)
         HashTableFree(mt_det_ctxs_hash);
 
+    SCMutexUnlock(&master->lock);
     return TM_ECODE_FAILED;
 }
 
@@ -3870,11 +3875,13 @@ DetectEngineCtx *DetectEngineReference(DetectEngineCtx *de_ctx)
     return de_ctx;
 }
 
-/** TODO locking? Not needed if this is a one time setting at startup */
-int DetectEngineMultiTenantEnabled(void)
+bool DetectEngineMultiTenantEnabled(void)
 {
     DetectEngineMasterCtx *master = &g_master_de_ctx;
-    return (master->multi_tenant_enabled);
+    SCMutexLock(&master->lock);
+    bool enabled = master->multi_tenant_enabled;
+    SCMutexUnlock(&master->lock);
+    return enabled;
 }
 
 /** \internal
index 0ba8322415b1bec48de5680d39ab5cbcdc3a06a5..c778a9d412e5652e3604475a825afb37c0009e28 100644 (file)
@@ -108,7 +108,7 @@ void DetectEngineDeReference(DetectEngineCtx **de_ctx);
 int DetectEngineReload(const SCInstance *suri);
 int DetectEngineEnabled(void);
 int DetectEngineMTApply(void);
-int DetectEngineMultiTenantEnabled(void);
+bool DetectEngineMultiTenantEnabled(void);
 int DetectEngineMultiTenantSetup(const bool unix_socket);
 
 int DetectEngineReloadStart(void);