diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-04-05 01:57:58 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-04-05 01:57:58 +0100 |
commit | c6cfb1fa571f03fae3fd7e1f274c9b9c24e68174 (patch) | |
tree | 4a1531c64ad20a06bb40341e537c7b4251d23e50 /src | |
parent | 8b01c72fc883bf50d8827763b4ad3d793f8a176d (diff) | |
download | rspamd-c6cfb1fa571f03fae3fd7e1f274c9b9c24e68174.tar.gz rspamd-c6cfb1fa571f03fae3fd7e1f274c9b9c24e68174.zip |
Fix issues in logger functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/lua/lua_logger.c | 70 |
1 files changed, 57 insertions, 13 deletions
diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c index 559a2a0f8..eff7df3fe 100644 --- a/src/lua/lua_logger.c +++ b/src/lua/lua_logger.c @@ -160,7 +160,7 @@ lua_logger_out_num (lua_State *L, gint pos, gchar *outbuf, gsize len) if ((gdouble)(glong)num == num) { inum = num; - r = rspamd_snprintf (outbuf, len, "%ld", inum); + r = rspamd_snprintf (outbuf, len, "%l", inum); } else { r = rspamd_snprintf (outbuf, len, "%f", num); @@ -188,42 +188,65 @@ lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len) gchar *d = outbuf; gsize remain = len, r; gboolean first = TRUE; + gint i; if (!lua_istable (L, pos)) { return 0; } lua_pushvalue (L, pos); - r = rspamd_snprintf (outbuf, remain, "{"); + r = rspamd_snprintf (d, remain, "{"); + remain -= r; + d += r; + + /* Get numeric keys (ipairs) */ + for (i = 1; ; i ++) { + lua_rawgeti (L, -1, i); + + if (lua_isnil (L, -1)) { + lua_pop (L, 1); + break; + } - for (lua_pushnil (L); lua_next (L, -2) && remain > 0; lua_pop (L, 1)) { - /* 'key' is at index -2 and 'value' is at index -1 */ if (!first) { r = rspamd_snprintf (d, remain, ", "); + MOVE_BUF(d, remain, r); } + r = rspamd_snprintf (d, remain, "[%d] = ", i); MOVE_BUF(d, remain, r); + r = lua_logger_out_type (L, -1, d, remain); + MOVE_BUF(d, remain, r); + + first = FALSE; + lua_pop (L, 1); + } + + /* Get string keys (pairs) */ + for (lua_pushnil (L); lua_next (L, -2) && remain > 0; lua_pop (L, 1)) { + /* 'key' is at index -2 and 'value' is at index -1 */ if (lua_type (L, -2) == LUA_TNUMBER) { - r = rspamd_snprintf (d, remain, "[%d] = ", - lua_tonumber (L, -2)); - } - else if (lua_type (L, -2) == LUA_TSTRING) { - r = rspamd_snprintf (d, remain, "[%s] = ", - lua_tostring (L, -2)); + continue; } - else { - g_assert (0); + + if (!first) { + r = rspamd_snprintf (d, remain, ", "); + MOVE_BUF(d, remain, r); } + r = rspamd_snprintf (d, remain, "[%s] = ", + lua_tostring (L, -2)); MOVE_BUF(d, remain, r); r = lua_logger_out_type (L, -1, d, remain); MOVE_BUF(d, remain, r); + + first = FALSE; } lua_pop (L, 1); - r = rspamd_snprintf (outbuf, remain, "}"); + r = rspamd_snprintf (d, remain, "}"); d += r; return (d - outbuf); @@ -331,6 +354,27 @@ lua_logger_logx (lua_State *L, GLogLevelFlags level, gboolean is_string) } } + if (state == parse_arg_num) { + arg_num = strtoul (c, NULL, 10); + + if (arg_num < 1 || arg_num > (guint)lua_gettop (L) + 1) { + msg_err ("wrong argument number: %ud", arg_num); + + if (is_string) { + lua_pushnil (L); + return 1; + } + else { + return 0; + } + } + + r = lua_logger_out_type (L, arg_num + 1, d, remain); + g_assert (r <= remain); + remain -= r; + d += r; + } + if (is_string) { lua_pushlstring (L, logbuf, sizeof (logbuf) - remain); return 1; |