Commit 349c9781 authored by antirez's avatar antirez
Browse files

Fix PFADD infinite loop.

We need to guarantee that the last bit is 1, otherwise an element may
hash to just zeroes with probability 1/(2^64) and trigger an infinite
loop.

See issue #1657.
parent b612affb
...@@ -317,14 +317,11 @@ int hllAdd(uint8_t *registers, unsigned char *ele, size_t elesize) { ...@@ -317,14 +317,11 @@ int hllAdd(uint8_t *registers, unsigned char *ele, size_t elesize) {
* This may sound like inefficient, but actually in the average case * This may sound like inefficient, but actually in the average case
* there are high probabilities to find a 1 after a few iterations. */ * there are high probabilities to find a 1 after a few iterations. */
hash = MurmurHash64A(ele,elesize,0); hash = MurmurHash64A(ele,elesize,0);
bit = REDIS_HLL_REGISTERS; hash |= ((uint64_t)1<<63); /* Make sure the loop terminates. */
count = 1; bit = REDIS_HLL_REGISTERS; /* First bit not used to address the register. */
count = 1; /* Initialized to 1 since we count the "00000...1" pattern. */
while((hash & bit) == 0) { while((hash & bit) == 0) {
count++; count++;
/* Test the next bit. Note that if we run out of bits in the 64
* bit integer, bit will be set to 0, and the while test will fail,
* so we can save the explicit check and yet the algorithm will
* terminate. */
bit <<= 1; bit <<= 1;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment