]> git.saurik.com Git - redis.git/commitdiff
Deny commands flagged as REDIS_CMD_NOSCRIPT from Lua scripts
authorantirez <antirez@gmail.com>
Tue, 27 Sep 2011 11:57:10 +0000 (13:57 +0200)
committerantirez <antirez@gmail.com>
Tue, 27 Sep 2011 11:57:10 +0000 (13:57 +0200)
src/redis.c
src/scripting.c

index 6cbac778ecdaaab3124ec58bd305e538a15438fd..94daf3488771c3e9f597b85cf0b8511c65eadee8 100644 (file)
@@ -125,7 +125,7 @@ struct redisCommand redisCommandTable[] = {
     {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0},
     {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0},
     {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0},
-    {"spop",spopCommand,2,"wR",0,NULL,1,1,1,0,0},
+    {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0},
     {"srandmember",srandmemberCommand,2,"rR",0,NULL,1,1,1,0,0},
     {"sinter",sinterCommand,-2,"r",0,NULL,1,-1,1,0,0},
     {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,2,-1,1,0,0},
index e952c7c6cb89449d97c09f0a36cb5fdba9272659..0c18d9165711c50fe44ef4aebbd9ed1d7cda521a 100644 (file)
@@ -158,24 +158,29 @@ int luaRedisCommand(lua_State *lua) {
         return 1;
     }
 
+    /* Setup our fake client for command execution */
+    c->argv = argv;
+    c->argc = argc;
+
     /* Command lookup */
     cmd = lookupCommand(argv[0]->ptr);
     if (!cmd || ((cmd->arity > 0 && cmd->arity != argc) ||
                    (argc < -cmd->arity)))
     {
-        for (j = 0; j < argc; j++) decrRefCount(argv[j]);
-        zfree(argv);
         if (cmd)
             luaPushError(lua,
                 "Wrong number of args calling Redis command From Lua script");
         else
             luaPushError(lua,"Unknown Redis command called from Lua script");
-        return 1;
+        goto cleanup;
     }
 
-    /* Run the command in the context of a fake client */
-    c->argv = argv;
-    c->argc = argc;
+    if (cmd->flags & REDIS_CMD_NOSCRIPT) {
+        luaPushError(lua, "This Redis command is not allowed from scripts");
+        goto cleanup;
+    }
+
+    /* Run the command */
     cmd->proc(c);
 
     /* Convert the result of the Redis command into a suitable Lua type.
@@ -195,6 +200,7 @@ int luaRedisCommand(lua_State *lua) {
     redisProtocolToLuaType(lua,reply);
     sdsfree(reply);
 
+cleanup:
     /* Clean up. Command code may have changed argv/argc so we use the
      * argv/argc of the client instead of the local variables. */
     for (j = 0; j < c->argc; j++)