From 13625cf7cc5aecb4329a0f77bb126808049378dd Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Tue, 8 Aug 2023 15:50:53 +0200 Subject: [PATCH] detect: free all tenant detect engines Free all tenants registered in the master. (cherry picked from commit a4d80bc7c4910170aba950db0a497124712b330a) --- src/detect-engine.c | 35 ++++++++++++++++++++++++++++------- src/detect-engine.h | 1 + src/suricata.c | 2 +- 3 files changed, 30 insertions(+), 8 deletions(-) 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(); -- 2.47.2