]> git.saurik.com Git - redis.git/commitdiff
Make sure that SELECT argument is an integer or return an error.
authorantirez <antirez@gmail.com>
Tue, 11 Sep 2012 08:32:04 +0000 (10:32 +0200)
committerantirez <antirez@gmail.com>
Tue, 11 Sep 2012 08:32:04 +0000 (10:32 +0200)
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.

src/db.c

index 6447838caa7e19f98378eeeed940c64de222001d..5f07e2b6d2b4f62feaf05ff65c85d86b8d946680 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -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");