diff options
-rw-r--r-- | src/t_zset.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/t_zset.c b/src/t_zset.c index be92e4521..c477fcbcb 100644 --- a/src/t_zset.c +++ b/src/t_zset.c @@ -735,10 +735,19 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) { /* because the zsets are sorted by size, its only possible * for sets at larger indices to hold this entry */ for (j = (i+1); j < setnum; j++) { - dictEntry *other = dictFind(src[j].dict,dictGetEntryKey(de)); - if (other) { - value = src[j].weight * zunionInterDictValue(other); + /* It is not safe to access the zset we are + * iterating, so explicitly check for equal object. */ + if (src[j].dict == src[i].dict) { + value = src[i].weight * zunionInterDictValue(de); zunionInterAggregate(&score,value,aggregate); + } else { + dictEntry *other; + + other = dictFind(src[j].dict,dictGetEntryKey(de)); + if (other) { + value = src[j].weight * zunionInterDictValue(other); + zunionInterAggregate(&score,value,aggregate); + } } } |