From: Victor Julien Date: Wed, 23 Feb 2022 10:05:40 +0000 (+0100) Subject: iprep: unify free handling X-Git-Tag: suricata-5.0.9~90 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3eaad759254d73e6faecd904e8e4d798bfa5e87;p=thirdparty%2Fsuricata.git iprep: unify free handling Introduce a new util function to free a Hosts iprep code. It also handles the Host use_cnt decrement. This change makes sure we also decrement the use_cnt when cleaning up when shutting down the host table. Move the BUG_ON check for use_cnt into the HostClearMemory() func to check it in more cases. (cherry picked from commit 172d2b28a58d923ddbc5644dd3bfb52e353b8a55) --- diff --git a/src/host.c b/src/host.c index 7db2d958f4..4a08378293 100644 --- a/src/host.c +++ b/src/host.c @@ -158,12 +158,13 @@ error: void HostClearMemory(Host *h) { if (h->iprep != NULL) { - SCFree(h->iprep); - h->iprep = NULL; + SRepFreeHostData(h); } if (HostStorageSize() > 0) HostFreeStorage(h); + + BUG_ON(SC_ATOMIC_GET(h->use_cnt) > 0); } #define HOST_DEFAULT_HASHSIZE 4096 @@ -313,7 +314,6 @@ void HostShutdown(void) /* free spare queue */ while((h = HostDequeue(&host_spare_q))) { - BUG_ON(SC_ATOMIC_GET(h->use_cnt) > 0); HostFree(h); } diff --git a/src/reputation.c b/src/reputation.c index 95f56532d6..330bf349c4 100644 --- a/src/reputation.c +++ b/src/reputation.c @@ -37,6 +37,7 @@ #include "conf.h" #include "detect.h" #include "reputation.h" +#include "util-validate.h" /** effective reputation version, atomic as the host * time out code will use it to check if a host's @@ -175,6 +176,14 @@ void SRepReloadComplete(void) SCLogDebug("effective Reputation version %u", SRepGetEffectiveVersion()); } +void SRepFreeHostData(Host *h) +{ + SCFree(h->iprep); + h->iprep = NULL; + DEBUG_VALIDATE_BUG_ON(SC_ATOMIC_GET(h->use_cnt) != 1); + HostDecrUsecnt(h); +} + /** \brief Set effective reputation version after * reputation initialization is complete. */ static void SRepInitComplete(void) @@ -205,11 +214,7 @@ int SRepHostTimedOut(Host *h) if (r->version < eversion) { SCLogDebug("host %p has reputation version %u, " "effective version is %u", h, r->version, eversion); - - SCFree(h->iprep); - h->iprep = NULL; - - HostDecrUsecnt(h); + SRepFreeHostData(h); return 1; } diff --git a/src/reputation.h b/src/reputation.h index 48d990ae00..52c0756e80 100644 --- a/src/reputation.h +++ b/src/reputation.h @@ -41,6 +41,7 @@ typedef struct SReputation_ { uint8_t rep[SREP_MAX_CATS]; } SReputation; +void SRepFreeHostData(Host *h); uint8_t SRepCatGetByShortname(char *shortname); int SRepInit(struct DetectEngineCtx_ *de_ctx); void SRepDestroy(struct DetectEngineCtx_ *de_ctx);