mirror of
https://github.com/fluencelabs/redis
synced 2025-04-01 15:21:03 +00:00
Fixed nul bulk parsing in Redis protocol to Lua type convertion. Check for bad Lua types as arguements of the redis() Lua command.
This commit is contained in:
parent
67e829dce5
commit
379789cc52
@ -3,3 +3,4 @@ TODO:
|
|||||||
redis('get',1) => crash
|
redis('get',1) => crash
|
||||||
Check what happens abotu MULTI/EXEC
|
Check what happens abotu MULTI/EXEC
|
||||||
Prevent Lua from calling itself with redis("eval",...)
|
Prevent Lua from calling itself with redis("eval",...)
|
||||||
|
Implement log() function, and define REDIS_WARNING, REDIS_NOTICE, ...
|
||||||
|
@ -67,7 +67,7 @@ char *redisProtocolToLuaType_Bulk(lua_State *lua, char *reply) {
|
|||||||
long long bulklen;
|
long long bulklen;
|
||||||
|
|
||||||
string2ll(reply+1,p-reply-1,&bulklen);
|
string2ll(reply+1,p-reply-1,&bulklen);
|
||||||
if (bulklen == 0) {
|
if (bulklen == -1) {
|
||||||
lua_pushnil(lua);
|
lua_pushnil(lua);
|
||||||
return p+2;
|
return p+2;
|
||||||
} else {
|
} else {
|
||||||
@ -113,6 +113,13 @@ char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply) {
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void luaPushError(lua_State *lua, char *error) {
|
||||||
|
lua_newtable(lua);
|
||||||
|
lua_pushstring(lua,"err");
|
||||||
|
lua_pushstring(lua, error);
|
||||||
|
lua_settable(lua,-3);
|
||||||
|
}
|
||||||
|
|
||||||
int luaRedisCommand(lua_State *lua) {
|
int luaRedisCommand(lua_State *lua) {
|
||||||
int j, argc = lua_gettop(lua);
|
int j, argc = lua_gettop(lua);
|
||||||
struct redisCommand *cmd;
|
struct redisCommand *cmd;
|
||||||
@ -122,9 +129,26 @@ int luaRedisCommand(lua_State *lua) {
|
|||||||
|
|
||||||
/* Build the arguments vector */
|
/* Build the arguments vector */
|
||||||
argv = zmalloc(sizeof(robj*)*argc);
|
argv = zmalloc(sizeof(robj*)*argc);
|
||||||
for (j = 0; j < argc; j++)
|
for (j = 0; j < argc; j++) {
|
||||||
|
if (!lua_isstring(lua,j+1)) break;
|
||||||
argv[j] = createStringObject((char*)lua_tostring(lua,j+1),
|
argv[j] = createStringObject((char*)lua_tostring(lua,j+1),
|
||||||
lua_strlen(lua,j+1));
|
lua_strlen(lua,j+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if one of the arguments passed by the Lua script
|
||||||
|
* is not a string or an integer (lua_isstring() return true for
|
||||||
|
* integers as well). */
|
||||||
|
if (j != argc) {
|
||||||
|
j--;
|
||||||
|
while (j >= 0) {
|
||||||
|
decrRefCount(argv[j]);
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
zfree(argv);
|
||||||
|
luaPushError(lua,
|
||||||
|
"Lua redis() command arguments must be strings or integers");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Command lookup */
|
/* Command lookup */
|
||||||
cmd = lookupCommand(argv[0]->ptr);
|
cmd = lookupCommand(argv[0]->ptr);
|
||||||
@ -133,14 +157,11 @@ int luaRedisCommand(lua_State *lua) {
|
|||||||
{
|
{
|
||||||
for (j = 0; j < argc; j++) decrRefCount(argv[j]);
|
for (j = 0; j < argc; j++) decrRefCount(argv[j]);
|
||||||
zfree(argv);
|
zfree(argv);
|
||||||
lua_newtable(lua);
|
|
||||||
lua_pushstring(lua,"err");
|
|
||||||
if (cmd)
|
if (cmd)
|
||||||
lua_pushstring(lua,
|
luaPushError(lua,
|
||||||
"Wrong number of args calling Redis command From Lua script");
|
"Wrong number of args calling Redis command From Lua script");
|
||||||
else
|
else
|
||||||
lua_pushstring(lua,"Unknown Redis command called from Lua script");
|
luaPushError(lua,"Unknown Redis command called from Lua script");
|
||||||
lua_settable(lua,-3);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +330,7 @@ void evalCommand(redisClient *c) {
|
|||||||
funcdef = sdscatlen(funcdef," ()\n",4);
|
funcdef = sdscatlen(funcdef," ()\n",4);
|
||||||
funcdef = sdscatlen(funcdef,c->argv[1]->ptr,sdslen(c->argv[1]->ptr));
|
funcdef = sdscatlen(funcdef,c->argv[1]->ptr,sdslen(c->argv[1]->ptr));
|
||||||
funcdef = sdscatlen(funcdef,"\nend\n",5);
|
funcdef = sdscatlen(funcdef,"\nend\n",5);
|
||||||
printf("Defining:\n%s\n",funcdef);
|
/* printf("Defining:\n%s\n",funcdef); */
|
||||||
|
|
||||||
if (luaL_loadbuffer(lua,funcdef,sdslen(funcdef),"func definition")) {
|
if (luaL_loadbuffer(lua,funcdef,sdslen(funcdef),"func definition")) {
|
||||||
addReplyErrorFormat(c,"Error compiling script (new function): %s\n",
|
addReplyErrorFormat(c,"Error compiling script (new function): %s\n",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user