From 57b8a53f03bc8a442fa3d90f9d763439912e31bb Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 17 Jun 2015 20:33:30 +0200 Subject: [PATCH] BUG/MEDIUM: lru: fix possible memory leak when ->free() is used Commit 7810ad7 ("BUG/MAJOR: lru: fix unconditional call to free due to unexpected semi-colon") was not enough, it happens that the free() is not performed at the right place because if the evicted node is recycled, we must also release its data before it gets overwritten. No backport is needed. --- src/lru.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lru.c b/src/lru.c index 0c452623c..4a46505f3 100644 --- a/src/lru.c +++ b/src/lru.c @@ -127,11 +127,11 @@ struct lru64 *lru64_get(unsigned long long key, struct lru64_head *lru, /* not locked */ LIST_DEL(&old->lru); __eb64_delete(&old->node); + if (old->data && old->free) + old->free(old->data); if (!lru->spare) lru->spare = old; else { - if (old->data && old->free) - old->free(old->data); free(old); } lru->cache_usage--;