From 0b561883b48db76a78497b1bebfd9367c80e2d96 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 22 Dec 2017 11:26:31 +0100 Subject: [PATCH] Hyperloglog: refresh hdr variable correctly. This is a fix for the #3819 improvements. The o->ptr may change because of hllSparseSet() calls, so 'hdr' must be correctly re-fetched. --- src/hyperloglog.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 65fbfd06..ef33979a 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -1347,14 +1347,16 @@ void pfmergeCommand(client *c) { /* Write the resulting HLL to the destination HLL registers and * invalidate the cached value. */ - hdr = o->ptr; for (j = 0; j < HLL_REGISTERS; j++) { if (max[j] == 0) continue; + hdr = o->ptr; switch(hdr->encoding) { case HLL_DENSE: hllDenseSet(hdr->registers,j,max[j]); break; case HLL_SPARSE: hllSparseSet(o,j,max[j]); break; } } + hdr = o->ptr; /* o->ptr may be different now, as a side effect of + last hllSparseSet() call. */ HLL_INVALIDATE_CACHE(hdr); signalModifiedKey(c->db,c->argv[1]);