Browse Source

Fix parsing of redis args

tags/1.1.2
Vsevolod Stakhov 8 years ago
parent
commit
f321b84bde
1 changed files with 45 additions and 7 deletions
  1. 45
    7
      src/lua/lua_redis.c

+ 45
- 7
src/lua/lua_redis.c View File

@@ -259,7 +259,7 @@ lua_redis_parse_args (lua_State *L, gint idx, const gchar *cmd,

if (idx != 0 && lua_type (L, idx) == LUA_TTABLE) {
/* Get all arguments */
lua_pushvalue (L, 5);
lua_pushvalue (L, idx);
lua_pushnil (L);
top = 0;

@@ -376,7 +376,9 @@ lua_redis_make_request (lua_State *L)
ud->L = L;
ud->cbref = cbref;
lua_pushstring (L, "args");
lua_gettable (L, -2);
lua_redis_parse_args (L, -1, cmd, &ud->args, &ud->nargs);
lua_pop (L, 1);
ret = TRUE;
}
else {
@@ -480,7 +482,8 @@ static int
lua_redis_make_request_sync (lua_State *L)
{
struct rspamd_lua_ip *addr = NULL;
const gchar *cmd = NULL;
rspamd_inet_addr_t *ip = NULL;
const gchar *cmd = NULL, *host;
struct timeval tv;
gboolean ret = FALSE;
gdouble timeout = REDIS_DEFAULT_TIMEOUT;
@@ -501,23 +504,45 @@ lua_redis_make_request_sync (lua_State *L)
if (lua_type (L, -1) == LUA_TUSERDATA) {
addr = lua_check_ip (L, -1);
}
else if (lua_type (L, -1) == LUA_TSTRING) {
host = lua_tostring (L, -1);
if (rspamd_parse_inet_address (&ip, host, strlen (host))) {
addr = g_alloca (sizeof (*addr));
addr->addr = ip;

if (rspamd_inet_address_get_port (ip) == 0) {
rspamd_inet_address_set_port (ip, 6379);
}
}
}
lua_pop (L, 1);

lua_pushstring (L, "timeout");
lua_gettable (L, -2);
timeout = lua_tonumber (L, -1);
if (lua_type (L, -1) == LUA_TNUMBER) {
timeout = lua_tonumber (L, -1);
}
lua_pop (L, 1);

lua_pushstring (L, "args");
lua_gettable (L, -2);
lua_redis_parse_args (L, -1, cmd, &args, &nargs);
ret = TRUE;
lua_pop (L, 1);

if (addr && cmd) {
ret = TRUE;
}
}

if (ret) {
msec_to_tv (timeout, &tv);
double_to_tv (timeout, &tv);
ctx = redisConnectWithTimeout (rspamd_inet_address_to_string (addr->addr),
rspamd_inet_address_get_port (addr->addr), tv);

if (ip) {
rspamd_inet_address_destroy (ip);
}

if (ctx == NULL || ctx->err) {
redisFree (ctx);
lua_redis_free_args (args, nargs);
@@ -532,8 +557,14 @@ lua_redis_make_request_sync (lua_State *L)
NULL);

if (r != NULL) {
lua_pushboolean (L, TRUE);
lua_redis_push_reply (L, r);
if (r->type != REDIS_REPLY_ERROR) {
lua_pushboolean (L, TRUE);
lua_redis_push_reply (L, r);
}
else {
lua_pushboolean (L, FALSE);
lua_pushstring (L, r->str);
}
freeReplyObject (r);
redisFree (ctx);

@@ -546,6 +577,13 @@ lua_redis_make_request_sync (lua_State *L)
lua_pushboolean (L, FALSE);
}
}
else {
if (ip) {
rspamd_inet_address_destroy (ip);
}
msg_err ("bad arguments for redis request");
lua_pushboolean (L, FALSE);
}

return 1;
}

Loading…
Cancel
Save