summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaruto Otake <trapezoid.g@gmail.com>2012-07-15 18:38:30 +0900
committerantirez <antirez@gmail.com>2012-09-05 16:20:21 +0200
commit4c3d419013e28c417a51f650f16b96807590c1e7 (patch)
treeb808759b4234e733e3876f5c4400843dcadc021b
parent0671d88cabc0fae782a5fe9af0ad388663e6e5c7 (diff)
downloadredis-4c3d419013e28c417a51f650f16b96807590c1e7.tar.gz
BITCOUNT: fix segmentation fault.
remove unsafe and unnecessary cast. until now, this cast may lead segmentation fault when end > UINT_MAX setbit foo 0 1 bitcount 0 4294967295 => ok bitcount 0 4294967296 => cause segmentation fault. Note by @antirez: the commit was modified a bit to also change the string length type to long, since it's guaranteed to be at max 512 MB in size, so we can work with the same type across all the code path. A regression test was also added.
-rw-r--r--src/bitops.c5
-rw-r--r--tests/unit/bitops.tcl6
2 files changed, 8 insertions, 3 deletions
diff --git a/src/bitops.c b/src/bitops.c
index deec0971d..39d24ab7d 100644
--- a/src/bitops.c
+++ b/src/bitops.c
@@ -327,10 +327,9 @@ void bitopCommand(redisClient *c) {
/* BITCOUNT key [start end] */
void bitcountCommand(redisClient *c) {
robj *o;
- long start, end;
+ long start, end, strlen;
unsigned char *p;
char llbuf[32];
- size_t strlen;
/* Lookup, check for type, and return 0 for non existing keys. */
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
@@ -357,7 +356,7 @@ void bitcountCommand(redisClient *c) {
if (end < 0) end = strlen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
- if ((unsigned)end >= strlen) end = strlen-1;
+ if (end >= strlen) end = strlen-1;
} else if (c->argc == 2) {
/* The whole string. */
start = 0;
diff --git a/tests/unit/bitops.tcl b/tests/unit/bitops.tcl
index 0e3403bfe..5945d32d7 100644
--- a/tests/unit/bitops.tcl
+++ b/tests/unit/bitops.tcl
@@ -73,6 +73,12 @@ start_server {tags {"bitops"}} {
set e
} {ERR*syntax*}
+ test {BITCOUNT regression test for github issue #582} {
+ r del str
+ r setbit foo 0 1
+ r bitcount foo 0 4294967296
+ } {1}
+
test {BITOP NOT (empty string)} {
r set s ""
r bitop not dest s