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.
diff --git a/src/cache.c b/src/cache.c
index ed244cb..c26b3a6 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -513,12 +513,19 @@
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 @@
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;
}
}