Permalink
Browse files

Make sure that SELECT argument is an integer or return an error.

Unfortunately we had still the lame atoi() without any error checking in
place, so "SELECT foo" would work as "SELECT 0". This was not an huge
problem per se but some people expected that DB can be strings and not
just numbers, and without errors you get the feeling that they can be
numbers, but not the behavior.

Now getLongFromObjectOrReply() is used as almost everybody else across
the code, generating an error if the number is not an integer or
overflows the long type.

Thanks to @mipearson for reporting that on Twitter.
  • Loading branch information...
1 parent 978e517 commit bfc197c3b604baf0dba739ea174d5054284133f0 @antirez committed Sep 11, 2012
Showing with 5 additions and 1 deletion.
  1. +5 −1 src/db.c
View
@@ -228,7 +228,11 @@ void existsCommand(redisClient *c) {
}
void selectCommand(redisClient *c) {
- int id = atoi(c->argv[1]->ptr);
+ long id;
+
+ if (getLongFromObjectOrReply(c, c->argv[1], &id,
+ "invalid DB index") != REDIS_OK)
+ return;
if (server.cluster_enabled && id != 0) {
addReplyError(c,"SELECT is not allowed in cluster mode");

0 comments on commit bfc197c

Please sign in to comment.