From 55e7674bc4a99fc20f10144053d0b5c3ab23bd0e Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Tue, 21 Nov 2017 20:01:28 +0100 Subject: [PATCH] BUG/MEDIUM: cache: refcount forbids to free the objects Some refcount decrementation were forgotten and they were forbidding to reuse the objects in some cases. --- src/cache.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/cache.c b/src/cache.c index ed244cb0a6..c26b3a6a92 100644 --- a/src/cache.c +++ b/src/cache.c @@ -513,12 +513,19 @@ static void http_cache_io_handler(struct appctx *appctx) int len = first->len - sizeof(struct cache_entry); if ((shctx_row_data_get(shctx, first, (unsigned char *)bi_end(res->buf), sizeof(struct cache_entry), len)) != 0) { fprintf(stderr, "cache error too big: %d\n", first->len - (int)sizeof(struct cache_entry)); + + shctx_lock(shctx_ptr(cache)); + shctx_row_dec_hot(shctx_ptr(cache), first); + shctx_unlock(shctx_ptr(cache)); si_applet_cant_put(si); goto out; } res->buf->i += len; res->total += len; appctx->st0 = HTTP_CACHE_FWD; + shctx_lock(shctx_ptr(cache)); + shctx_row_dec_hot(shctx_ptr(cache), first); + shctx_unlock(shctx_ptr(cache)); } if (appctx->st0 == HTTP_CACHE_FWD) { @@ -609,6 +616,9 @@ enum act_return http_action_req_cache_use(struct act_rule *rule, struct proxy *p appctx->ctx.cache.entry = res; return ACT_RET_CONT; } else { + shctx_lock(shctx_ptr(cache)); + shctx_row_dec_hot(shctx_ptr(cache), block_ptr(res)); + shctx_unlock(shctx_ptr(cache)); return ACT_RET_YIELD; } } -- 2.47.3