From: Victor Julien Date: Tue, 8 Aug 2023 13:50:53 +0000 (+0200) Subject: detect: free all tenant detect engines X-Git-Tag: suricata-6.0.16~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13625cf7cc5aecb4329a0f77bb126808049378dd;p=thirdparty%2Fsuricata.git detect: free all tenant detect engines Free all tenants registered in the master. (cherry picked from commit a4d80bc7c4910170aba950db0a497124712b330a) --- diff --git a/src/detect-engine.c b/src/detect-engine.c index 2a3c7f4c76..528afb0568 100644 --- a/src/detect-engine.c +++ b/src/detect-engine.c @@ -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 diff --git a/src/detect-engine.h b/src/detect-engine.h index 5d58151d0c..967228bf0b 100644 --- a/src/detect-engine.h +++ b/src/detect-engine.h @@ -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); diff --git a/src/suricata.c b/src/suricata.c index 6b1a5b4d66..a4ef7f5609 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -402,7 +402,7 @@ static void GlobalsDestroy(SCInstance *suri) DetectEngineMoveToFreeList(de_ctx); DetectEngineDeReference(&de_ctx); } - DetectEnginePruneFreeList(); + DetectEngineClearMaster(); AppLayerDeSetup(); DatasetsSave();