From: Tim Duesterhus Date: Mon, 14 Sep 2020 16:01:33 +0000 (+0200) Subject: CLEANUP: cache: Fix leak of cconf->c.name during config check X-Git-Tag: v2.3-dev6~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7c6e6a71d34ec028365c4d4c96063b3d5e0e3a4;p=thirdparty%2Fhaproxy.git CLEANUP: cache: Fix leak of cconf->c.name during config check During the config check, the post parsing is not performed. Thus, cache filters are not fully initialized and their cache name are never released. To be able to release them, a flag is now set when a cache filter is fully initialized. On deinit, if the flag is not set, it means the cache name must be freed. The patch should fix #849. No backport needed. [Cf: Tim is the patch author, but I added the commit message] --- diff --git a/src/cache.c b/src/cache.c index b42262948a..fe213a6aae 100644 --- a/src/cache.c +++ b/src/cache.c @@ -33,6 +33,7 @@ #define CACHE_FLT_F_IMPLICIT_DECL 0x00000001 /* The cache filtre was implicitly declared (ie without * the filter keyword) */ +#define CACHE_FLT_INIT 0x00000002 /* Whether the cache name was freed. */ const char *cache_store_flt_id = "cache store filter"; @@ -133,6 +134,8 @@ cache_store_deinit(struct proxy *px, struct flt_conf *fconf) { struct cache_flt_conf *cconf = fconf->conf; + if (!(cconf->flags & CACHE_FLT_INIT)) + free(cconf->c.name); free(cconf); } @@ -1376,6 +1379,7 @@ int post_check_cache() cconf = fconf->conf; if (!strcmp(cache->id, cconf->c.name)) { free(cconf->c.name); + cconf->flags |= CACHE_FLT_INIT; cconf->c.cache = cache; break; }