]> git.saurik.com Git - redis.git/commitdiff
Scripting: require at least one argument for redis.call().
authorantirez <antirez@gmail.com>
Fri, 31 Aug 2012 08:22:21 +0000 (10:22 +0200)
committerantirez <antirez@gmail.com>
Fri, 31 Aug 2012 08:28:13 +0000 (10:28 +0200)
Redis used to crash with a call like the following:

    EVAL "redis.call()" 0

Now the explicit check for at least one argument prevents the problem.

This commit fixes issue #655.

src/scripting.c
tests/unit/scripting.tcl

index 8c89c923c0ce4331b7136dc453141b578b870758..b1cbc6ff4e9467efdce5d21098a2b67d33b43dbe 100644 (file)
@@ -167,6 +167,13 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
     redisClient *c = server.lua_client;
     sds reply;
 
     redisClient *c = server.lua_client;
     sds reply;
 
+    /* Require at least one argument */
+    if (argc == 0) {
+        luaPushError(lua,
+            "Please specify at least one argument for redis.call()");
+        return 1;
+    }
+
     /* Build the arguments vector */
     argv = zmalloc(sizeof(robj*)*argc);
     for (j = 0; j < argc; j++) {
     /* Build the arguments vector */
     argv = zmalloc(sizeof(robj*)*argc);
     for (j = 0; j < argc; j++) {
index ec6e5c2a6be5fface52a5e69d75164e3d1d2adb0..6d60e419871117dd5e9a414ecf517fe924b3cda7 100644 (file)
@@ -145,6 +145,12 @@ start_server {tags {"scripting"}} {
         set e
     } {*not allowed after*}
 
         set e
     } {*not allowed after*}
 
+    test {EVAL - No arguments to redis.call/pcall is considered an error} {
+        set e {}
+        catch {r eval {return redis.call()} 0} e
+        set e
+    } {*one argument*}
+
     test {EVAL - redis.call variant raises a Lua error on Redis cmd error (1)} {
         set e {}
         catch {
     test {EVAL - redis.call variant raises a Lua error on Redis cmd error (1)} {
         set e {}
         catch {