From 15ef6053404686995024adb373854a009a3d2d39 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 27 Sep 2011 13:57:10 +0200 Subject: [PATCH] Deny commands flagged as REDIS_CMD_NOSCRIPT from Lua scripts --- src/redis.c | 2 +- src/scripting.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/redis.c b/src/redis.c index 6cbac778..94daf348 100644 --- a/src/redis.c +++ b/src/redis.c @@ -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}, diff --git a/src/scripting.c b/src/scripting.c index e952c7c6..0c18d916 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -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++) -- 2.45.2