summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2021-11-19 17:25:41 +0100
committerWilly Tarreau <w@1wt.eu>2021-11-19 19:25:13 +0100
commitda91842b6cacec8a85ac572b117c7d3562102056 (patch)
tree2167e820f55b407c17ec7f4a4d3a7535a91d4689
parent00a15025bea006e4cf4f7ca57be066acb2d868f8 (diff)
downloadhaproxy-da91842b6cacec8a85ac572b117c7d3562102056.tar.gz
BUG/MEDIUM: cache/cli: make "show cache" thread-safe
The "show cache" command restarts from the previous node to look for a duplicate key, but does this after having released the lock, so under high write load, the node has many chances of having been reassigned and the dereference of the node crashes after a few iterations. Since the keys are unique anyway, there's no point looking for a dup, so let's just continue from the next value. This is only marked as medium as it seems to have been there for a while, and discovering it that late simply means that nobody uses that command, thus in practice it has a very limited impact on real users. This should be backported to all stable versions.
-rw-r--r--src/cache.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/cache.c b/src/cache.c
index 287ff5325..6ac23b27c 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -2589,7 +2589,7 @@ static int cli_io_handler_show_cache(struct appctx *appctx)
while (1) {
shctx_lock(shctx_ptr(cache));
- if (!node || (node = eb32_next_dup(node)) == NULL)
+ if (!node)
node = eb32_lookup_ge(&cache->entries, next_key);
if (!node) {
shctx_unlock(shctx_ptr(cache));