From a0ba7b3f00b91eec3a8a6ec3587166e29015a4b3 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 20 Jan 2015 18:01:28 +0100 Subject: [PATCH] Panic on recursive calls to luaRedisGenericCommand(). Related to issue #2302. --- src/scripting.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/scripting.c b/src/scripting.c index 7dbd5f74..5a020a73 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -213,11 +213,22 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { static int argv_size = 0; static robj *cached_objects[LUA_CMD_OBJCACHE_SIZE]; static size_t cached_objects_len[LUA_CMD_OBJCACHE_SIZE]; + static int inuse = 0; /* Recursive calls detection. */ + + /* By using Lua debug hooks it is possible to trigger a recursive call + * to luaRedisGenericCommand(), which normally should never happen. + * To make this function reentrant is futile and makes it slower, but + * we should at least detect such a misuse, and abort. */ + if (inuse) { + redisPanic("luaRedisGenericCommand() recursive call detected. Are you doing funny stuff with Lua debug hooks?"); + } + inuse++; /* Require at least one argument */ if (argc == 0) { luaPushError(lua, "Please specify at least one argument for redis.call()"); + inuse--; return 1; } @@ -272,6 +283,7 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { } luaPushError(lua, "Lua redis() command arguments must be strings or integers"); + inuse--; return 1; } @@ -408,8 +420,10 @@ cleanup: * return the plain error. */ lua_pushstring(lua,"err"); lua_gettable(lua,-2); + inuse--; return lua_error(lua); } + inuse--; return 1; }