Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
bbe025e0
Commit
bbe025e0
authored
Mar 29, 2010
by
Alex McHale
Browse files
Validate numeric inputs.
parent
e0a62c7f
Changes
2
Hide whitespace changes
Inline
Side-by-side
redis.c
View file @
bbe025e0
...
...
@@ -3065,6 +3065,77 @@ static size_t stringObjectLen(robj *o) {
}
}
static int getDoubleFromObject(redisClient *c, robj *o, double *value) {
double parsedValue;
char *eptr = NULL;
if (o && o->type != REDIS_STRING) {
addReplySds(c,sdsnew("-ERR value is not a double\r\n"));
return REDIS_ERR;
}
if (o == NULL)
parsedValue = 0;
else if (o->encoding == REDIS_ENCODING_RAW)
parsedValue = strtod(o->ptr, &eptr);
else if (o->encoding == REDIS_ENCODING_INT)
parsedValue = (long)o->ptr;
else
redisAssert(1 != 1);
if (eptr != NULL && *eptr != '\0') {
addReplySds(c,sdsnew("-ERR value is not a double\r\n"));
return REDIS_ERR;
}
*value = parsedValue;
return REDIS_OK;
}
static int getLongLongFromObject(redisClient *c, robj *o, long long *value) {
long long parsedValue;
char *eptr = NULL;
if (o && o->type != REDIS_STRING) {
addReplySds(c,sdsnew("-ERR value is not an integer\r\n"));
return REDIS_ERR;
}
if (o == NULL)
parsedValue = 0;
else if (o->encoding == REDIS_ENCODING_RAW)
parsedValue = strtoll(o->ptr, &eptr, 10);
else if (o->encoding == REDIS_ENCODING_INT)
parsedValue = (long)o->ptr;
else
redisAssert(1 != 1);
if (eptr != NULL && *eptr != '\0') {
addReplySds(c,sdsnew("-ERR value is not an integer\r\n"));
return REDIS_ERR;
}
*value = parsedValue;
return REDIS_OK;
}
static int getLongFromObject(redisClient *c, robj *o, long *value) {
long long actualValue;
if (getLongLongFromObject(c, o, &actualValue) != REDIS_OK) return REDIS_ERR;
if (actualValue < LONG_MIN || actualValue > LONG_MAX) {
addReplySds(c,sdsnew("-ERR value is out of range\r\n"));
return REDIS_ERR;
}
*value = actualValue;
return REDIS_OK;
}
/*============================ RDB saving/loading =========================== */
static int rdbSaveType(FILE *fp, unsigned char type) {
...
...
@@ -3950,22 +4021,8 @@ static void incrDecrCommand(redisClient *c, long long incr) {
robj *o;
o = lookupKeyWrite(c->db,c->argv[1]);
if (o == NULL) {
value = 0;
} else {
if (o->type != REDIS_STRING) {
value = 0;
} else {
char *eptr;
if (o->encoding == REDIS_ENCODING_RAW)
value = strtoll(o->ptr, &eptr, 10);
else if (o->encoding == REDIS_ENCODING_INT)
value = (long)o->ptr;
else
redisAssert(1 != 1);
}
}
if (getLongLongFromObject(c, o, &value) != REDIS_OK) return;
value += incr;
o = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",value));
...
...
@@ -3992,12 +4049,18 @@ static void decrCommand(redisClient *c) {
}
static void incrbyCommand(redisClient *c) {
long long incr = strtoll(c->argv[2]->ptr, NULL, 10);
long long incr;
if (getLongLongFromObject(c, c->argv[2], &incr) != REDIS_OK) return;
incrDecrCommand(c,incr);
}
static void decrbyCommand(redisClient *c) {
long long incr = strtoll(c->argv[2]->ptr, NULL, 10);
long long incr;
if (getLongLongFromObject(c, c->argv[2], &incr) != REDIS_OK) return;
incrDecrCommand(c,-incr);
}
...
...
@@ -5395,14 +5458,16 @@ static void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double scor
static void zaddCommand(redisClient *c) {
double scoreval;
scoreval = strtod(c->argv[2]->ptr,NULL);
if (getDoubleFromObject(c, c->argv[2], &scoreval) != REDIS_OK) return;
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,0);
}
static void zincrbyCommand(redisClient *c) {
double scoreval;
scoreval = strtod(c->argv[2]->ptr,NULL);
if (getDoubleFromObject(c, c->argv[2], &scoreval) != REDIS_OK) return;
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,1);
}
...
...
@@ -5436,12 +5501,15 @@ static void zremCommand(redisClient *c) {
}
static void zremrangebyscoreCommand(redisClient *c) {
double min
= strtod(c->argv[2]->ptr,NULL)
;
double max
= strtod(c->argv[3]->ptr,NULL)
;
double min;
double max;
long deleted;
robj *zsetobj;
zset *zs;
if ((getDoubleFromObject(c, c->argv[2], &min) != REDIS_OK) ||
(getDoubleFromObject(c, c->argv[3], &max) != REDIS_OK)) return;
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,zsetobj,REDIS_ZSET)) return;
...
...
@@ -5454,13 +5522,16 @@ static void zremrangebyscoreCommand(redisClient *c) {
}
static void zremrangebyrankCommand(redisClient *c) {
int
start
= atoi(c->argv[2]->ptr)
;
int end = atoi(c->argv[3]->ptr)
;
long
start;
long end
;
int llen;
long deleted;
robj *zsetobj;
zset *zs;
if ((getLongFromObject(c, c->argv[2], &start) != REDIS_OK) ||
(getLongFromObject(c, c->argv[3], &end) != REDIS_OK)) return;
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,zsetobj,REDIS_ZSET)) return;
zs = zsetobj->ptr;
...
...
@@ -5567,7 +5638,8 @@ static void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
if (remaining >= (zsetnum + 1) && !strcasecmp(c->argv[j]->ptr,"weights")) {
j++; remaining--;
for (i = 0; i < zsetnum; i++, j++, remaining--) {
src[i].weight = strtod(c->argv[j]->ptr, NULL);
if (getDoubleFromObject(c, c->argv[j], &src[i].weight) != REDIS_OK)
return;
}
} else if (remaining >= 2 && !strcasecmp(c->argv[j]->ptr,"aggregate")) {
j++; remaining--;
...
...
@@ -5689,8 +5761,8 @@ static void zinterCommand(redisClient *c) {
static void zrangeGenericCommand(redisClient *c, int reverse) {
robj *o;
int
start
= atoi(c->argv[2]->ptr)
;
int end = atoi(c->argv[3]->ptr)
;
long
start;
long end
;
int withscores = 0;
int llen;
int rangelen, j;
...
...
@@ -5699,6 +5771,9 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
zskiplistNode *ln;
robj *ele;
if ((getLongFromObject(c, c->argv[2], &start) != REDIS_OK) ||
(getLongFromObject(c, c->argv[3], &end) != REDIS_OK)) return;
if (c->argc == 5 && !strcasecmp(c->argv[4]->ptr,"withscores")) {
withscores = 1;
} else if (c->argc >= 5) {
...
...
@@ -6085,7 +6160,8 @@ static void hincrbyCommand(redisClient *c) {
}
}
incr = strtoll(c->argv[3]->ptr, NULL, 10);
if (getLongLongFromObject(c, c->argv[3], &incr) != REDIS_OK) return;
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
unsigned char *zm = o->ptr;
unsigned char *zval;
...
...
@@ -6917,8 +6993,13 @@ static int deleteIfVolatile(redisDb *db, robj *key) {
return dictDelete(db->dict,key) == DICT_OK;
}
static void expireGenericCommand(redisClient *c, robj *key,
time_t seconds
) {
static void expireGenericCommand(redisClient *c, robj *key,
robj *param, long offset
) {
dictEntry *de;
time_t seconds;
if (getLongFromObject(c, param, &seconds) != REDIS_OK) return;
seconds -= offset;
de = dictFind(c->db->dict,key);
if (de == NULL) {
...
...
@@ -6942,11 +7023,11 @@ static void expireGenericCommand(redisClient *c, robj *key, time_t seconds) {
}
static void expireCommand(redisClient *c) {
expireGenericCommand(c,c->argv[1],
strtol(
c->argv[2]
->ptr,NULL,10)
);
expireGenericCommand(c,c->argv[1],c->argv[2]
,0
);
}
static void expireatCommand(redisClient *c) {
expireGenericCommand(c,c->argv[1],
strtol(
c->argv[2]
->ptr,NULL,10)-
time(NULL));
expireGenericCommand(c,c->argv[1],c->argv[2]
,
time(NULL));
}
static void ttlCommand(redisClient *c) {
...
...
test-redis.tcl
View file @
bbe025e0
...
...
@@ -359,10 +359,18 @@ proc main {server port} {
$r incrby novar 17179869184
}
{
34359738368
}
test
{
INCR against key with spaces
(
no integer encoded
)}
{
test
{
INCR
fails
against key with spaces
(
no integer encoded
)}
{
$r set novar
" 11 "
$r incr novar
}
{
12
}
catch
{
$r
incr novar
}
err
format $err
}
{
ERR*
}
test
{
INCR fails against a key holding a list
}
{
$r rpush mylist 1
catch
{
$r
incr novar
}
err
$r rpop mylist
format $err
}
{
ERR*
}
test
{
DECRBY over 32bit value with over 32bit increment, negative res
}
{
$r set novar 17179869184
...
...
@@ -902,9 +910,9 @@ proc main {server port} {
$r lpush mysavelist world
$r set myemptykey
{}
$r set mynormalkey
{
blablablba
}
$r zadd mytestzset
a
10
$r zadd mytestzset
b
20
$r zadd mytestzset
c
30
$r zadd mytestzset 10
a
$r zadd mytestzset 20
b
$r zadd mytestzset 30
c
$r save
}
{
OK
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment