Permalink
Browse files

SDIFF iterator misuse fixed in diff algorithm #1.

The bug could be easily triggered by:

    SADD foo a b c 1 2 3 4 5 6
    SDIFF foo foo

When the key was the same in two sets, an unsafe iterator was used to
check existence of elements in the same set we were iterating.
Usually this would just result into a wrong output, however with the
dict.c API misuse protection we have in place, the result was actually
an assertion failed that was triggered by the CI test, while creating
random datasets for the "MASTER and SLAVE consistency" test.
  • Loading branch information...
antirez committed Dec 13, 2013
1 parent 5320148 commit c00453da1d01dbd2de40d26602c979b516f8a47f
Showing with 1 addition and 0 deletions.
  1. +1 −0 src/t_set.c
View
@@ -820,6 +820,7 @@ void sunionDiffGenericCommand(redisClient *c, robj **setkeys, int setnum, robj *
while((ele = setTypeNextObject(si)) != NULL) {
for (j = 1; j < setnum; j++) {
if (!sets[j]) continue; /* no key is an empty set. */
+ if (sets[j] == sets[0]) break; /* same set! */
if (setTypeIsMember(sets[j],ele)) break;
}
if (j == setnum) {

0 comments on commit c00453d

Please sign in to comment.