Fix core dump when using 'command getkeys' with wrong arguments.

This commit is contained in:
赵磊 2018-04-20 20:19:03 +08:00
parent e6b0e8d9ec
commit 10dedc2586
2 changed files with 14 additions and 7 deletions

View File

@ -1224,7 +1224,7 @@ int *zunionInterGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *nu
num = atoi(argv[2]->ptr); num = atoi(argv[2]->ptr);
/* Sanity check. Don't return any key if the command is going to /* Sanity check. Don't return any key if the command is going to
* reply with syntax error. */ * reply with syntax error. */
if (num > (argc-3)) { if (num < 1 || num > (argc-3)) {
*numkeys = 0; *numkeys = 0;
return NULL; return NULL;
} }
@ -1253,7 +1253,7 @@ int *evalGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
num = atoi(argv[2]->ptr); num = atoi(argv[2]->ptr);
/* Sanity check. Don't return any key if the command is going to /* Sanity check. Don't return any key if the command is going to
* reply with syntax error. */ * reply with syntax error. */
if (num > (argc-3)) { if (num <= 0 || num > (argc-3)) {
*numkeys = 0; *numkeys = 0;
return NULL; return NULL;
} }
@ -1398,7 +1398,7 @@ int *xreadGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
if (streams_pos != -1) num = argc - streams_pos - 1; if (streams_pos != -1) num = argc - streams_pos - 1;
/* Syntax error. */ /* Syntax error. */
if (streams_pos == -1 || num % 2 != 0) { if (streams_pos == -1 || num == 0 || num % 2 != 0) {
*numkeys = 0; *numkeys = 0;
return NULL; return NULL;
} }

View File

@ -2842,7 +2842,10 @@ NULL
int *keys, numkeys, j; int *keys, numkeys, j;
if (!cmd) { if (!cmd) {
addReplyErrorFormat(c,"Invalid command specified"); addReplyError(c,"Invalid command specified");
return;
} else if (cmd->getkeys_proc == NULL && cmd->firstkey == 0) {
addReplyError(c,"The command has no key arguments");
return; return;
} else if ((cmd->arity > 0 && cmd->arity != c->argc-2) || } else if ((cmd->arity > 0 && cmd->arity != c->argc-2) ||
((c->argc-2) < -cmd->arity)) ((c->argc-2) < -cmd->arity))
@ -2852,9 +2855,13 @@ NULL
} }
keys = getKeysFromCommand(cmd,c->argv+2,c->argc-2,&numkeys); keys = getKeysFromCommand(cmd,c->argv+2,c->argc-2,&numkeys);
if (!keys) {
addReplyError(c,"Invalid arguments specified for command");
} else {
addReplyMultiBulkLen(c,numkeys); addReplyMultiBulkLen(c,numkeys);
for (j = 0; j < numkeys; j++) addReplyBulk(c,c->argv[keys[j]+2]); for (j = 0; j < numkeys; j++) addReplyBulk(c,c->argv[keys[j]+2]);
getKeysFreeResult(keys); getKeysFreeResult(keys);
}
} else { } else {
addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try COMMAND HELP", (char*)c->argv[1]->ptr); addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try COMMAND HELP", (char*)c->argv[1]->ptr);
} }