From d7c6e6a71d34ec028365c4d4c96063b3d5e0e3a4 Mon Sep 17 00:00:00 2001 From: Tim Duesterhus Date: Mon, 14 Sep 2020 18:01:33 +0200 Subject: [PATCH] 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] --- src/cache.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cache.c b/src/cache.c index b42262948..fe213a6aa 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; }