]> git.saurik.com Git - redis.git/commitdiff
BITOP bug when called against non existing keys fixed.
authorantirez <antirez@gmail.com>
Thu, 31 May 2012 19:45:39 +0000 (21:45 +0200)
committerantirez <antirez@gmail.com>
Thu, 31 May 2012 19:51:52 +0000 (21:51 +0200)
In the issue #529 an user reported a bug that can be triggered with the
following code:

flushdb
set a
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
bitop or x a b

The bug was introduced with the speed optimization in commit 8bbc076
that specializes every BITOP operation loop up to the minimum length of
the input strings.

However the computation of the minimum length contained an error when a
non existing key was present in the input, after a key that was non zero
length.

This commit fixes the bug and adds a regression test for it.

src/bitops.c
tests/unit/bitops.tcl

index d309b7afa15cc05b7b4b33df9e1a18289ddb702e..00192b92b14fc13194ded59143b1f2a9582e8871 100644 (file)
@@ -197,6 +197,7 @@ void bitopCommand(redisClient *c) {
             objects[j] = NULL;
             src[j] = NULL;
             len[j] = 0;
+            minlen = 0;
             continue;
         }
         /* Return an error if one of the keys is not a string. */
index c8f58ef1e5931b5a0b6fb34a88e881cf449ea6e7..0e3403bfe1818ee043788127f6cf430902418497 100644 (file)
@@ -160,4 +160,10 @@ start_server {tags {"bitops"}} {
         catch {r bitop xor dest a b c d} e
         set e
     } {*ERR*}
+
+    test {BITOP with empty string after non empty string (issue #529)} {
+        r flushdb
+        r set a "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+        r bitop or x a b
+    } {32}
 }