summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
24bc807)
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.
/* BITCOUNT key [start end] */
void bitcountCommand(redisClient *c) {
robj *o;
/* BITCOUNT key [start end] */
void bitcountCommand(redisClient *c) {
robj *o;
+ long start, end, strlen;
unsigned char *p;
char llbuf[32];
unsigned char *p;
char llbuf[32];
/* Lookup, check for type, and return 0 for non existing keys. */
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
/* Lookup, check for type, and return 0 for non existing keys. */
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
if (end < 0) end = strlen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
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;
} else if (c->argc == 2) {
/* The whole string. */
start = 0;
+ 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
test {BITOP NOT (empty string)} {
r set s ""
r bitop not dest s