Commit 406be0ea authored by antirez's avatar antirez
Browse files

Use strtoul() instead of sscanf() in SCAN implementation.

parent 4b615eea
...@@ -354,7 +354,7 @@ void scanCallback(void *privdata, const dictEntry *de) { ...@@ -354,7 +354,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;
...@@ -371,9 +371,12 @@ void scanGenericCommand(redisClient *c, robj *o) { ...@@ -371,9 +371,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;
} }
......
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