summaryrefslogtreecommitdiff
path: root/src/blocked.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2017-09-19 16:57:37 +0200
committerantirez <antirez@gmail.com>2017-12-01 10:24:24 +0100
commit8f00cf85a7ee93da987e8d0b899ada33f2a88505 (patch)
tree142634eb04876552b3b8b7e130805978da9ff2b6 /src/blocked.c
parentae9065d8080cff60efb97676de5f3bfb26c74285 (diff)
downloadredis-8f00cf85a7ee93da987e8d0b899ada33f2a88505.tar.gz
Streams: fixed memory leaks when blocking again for same stream.
blockForKeys() was not freeing the allocation holding the ID when the key was already found busy. Fortunately the unit test checked explicitly for blocking multiple times for the same key (copying a regression in the blocking lists tests), so the bug was detected by the Redis test leak checker.
Diffstat (limited to 'src/blocked.c')
-rw-r--r--src/blocked.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/blocked.c b/src/blocked.c
index 519a402cf..734e6ffd6 100644
--- a/src/blocked.c
+++ b/src/blocked.c
@@ -387,7 +387,10 @@ void blockForKeys(client *c, int btype, robj **keys, int numkeys, mstime_t timeo
}
/* If the key already exists in the dictionary ignore it. */
- if (dictAdd(c->bpop.keys,keys[j],key_data) != DICT_OK) continue;
+ if (dictAdd(c->bpop.keys,keys[j],key_data) != DICT_OK) {
+ zfree(key_data);
+ continue;
+ }
incrRefCount(keys[j]);
/* And in the other "side", to map keys -> clients */