mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Use strtoul() instead of sscanf() in SCAN implementation.
This commit is contained in:
parent
bf79c0cda2
commit
101d4bf867
11
src/db.c
11
src/db.c
@ -364,7 +364,7 @@ void scanCallback(void *privdata, const dictEntry *de) {
|
|||||||
void scanGenericCommand(redisClient *c, robj *o) {
|
void scanGenericCommand(redisClient *c, robj *o) {
|
||||||
int rv;
|
int rv;
|
||||||
int i, j;
|
int i, j;
|
||||||
char buf[REDIS_LONGSTR_SIZE];
|
char buf[REDIS_LONGSTR_SIZE], *eptr;
|
||||||
list *keys = listCreate();
|
list *keys = listCreate();
|
||||||
listNode *node, *nextnode;
|
listNode *node, *nextnode;
|
||||||
unsigned long cursor = 0;
|
unsigned long cursor = 0;
|
||||||
@ -381,9 +381,12 @@ void scanGenericCommand(redisClient *c, robj *o) {
|
|||||||
/* Set i to the first option argument. The previous one is the cursor. */
|
/* Set i to the first option argument. The previous one is the cursor. */
|
||||||
i = (o == NULL) ? 2 : 3; /* Skip the key argument if needed. */
|
i = (o == NULL) ? 2 : 3; /* Skip the key argument if needed. */
|
||||||
|
|
||||||
/* Use sscanf because we need an *unsigned* long */
|
/* Use strtoul() because we need an *unsigned* long, so
|
||||||
rv = sscanf(c->argv[i-1]->ptr, "%lu", &cursor);
|
* getLongLongFromObject() does not cover the whole cursor space. */
|
||||||
if (rv != 1) {
|
errno = 0;
|
||||||
|
cursor = strtoul(c->argv[i-1]->ptr, &eptr, 10);
|
||||||
|
if (isspace(((char*)c->argv[i-1])[0]) || eptr[0] != '\0' || errno == ERANGE)
|
||||||
|
{
|
||||||
addReplyError(c, "invalid cursor");
|
addReplyError(c, "invalid cursor");
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user