diff --git a/src/db.c b/src/db.c index 83ffbcc9..877294ee 100644 --- a/src/db.c +++ b/src/db.c @@ -1240,7 +1240,7 @@ int *zunionInterGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *nu num = atoi(argv[2]->ptr); /* Sanity check. Don't return any key if the command is going to * reply with syntax error. */ - if (num > (argc-3)) { + if (num < 1 || num > (argc-3)) { *numkeys = 0; return NULL; } @@ -1269,7 +1269,7 @@ int *evalGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) num = atoi(argv[2]->ptr); /* Sanity check. Don't return any key if the command is going to * reply with syntax error. */ - if (num > (argc-3)) { + if (num <= 0 || num > (argc-3)) { *numkeys = 0; return NULL; } @@ -1414,7 +1414,7 @@ int *xreadGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) if (streams_pos != -1) num = argc - streams_pos - 1; /* Syntax error. */ - if (streams_pos == -1 || num % 2 != 0) { + if (streams_pos == -1 || num == 0 || num % 2 != 0) { *numkeys = 0; return NULL; } diff --git a/src/server.c b/src/server.c index e7d3c1a6..a59a75ac 100644 --- a/src/server.c +++ b/src/server.c @@ -2854,7 +2854,10 @@ NULL int *keys, numkeys, j; 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; } else if ((cmd->arity > 0 && cmd->arity != c->argc-2) || ((c->argc-2) < -cmd->arity)) @@ -2864,9 +2867,13 @@ NULL } keys = getKeysFromCommand(cmd,c->argv+2,c->argc-2,&numkeys); - addReplyMultiBulkLen(c,numkeys); - for (j = 0; j < numkeys; j++) addReplyBulk(c,c->argv[keys[j]+2]); - getKeysFreeResult(keys); + if (!keys) { + addReplyError(c,"Invalid arguments specified for command"); + } else { + addReplyMultiBulkLen(c,numkeys); + for (j = 0; j < numkeys; j++) addReplyBulk(c,c->argv[keys[j]+2]); + getKeysFreeResult(keys); + } } else { addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try COMMAND HELP", (char*)c->argv[1]->ptr); }