diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-08-05 21:04:06 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2020-08-05 21:05:09 +0100 |
commit | 09fc651620d5d55949fb0ad60e402fb5e62668e2 (patch) | |
tree | 634a7c7ef60751ec7a31ab810601a9507b5012bf /src/lua/lua_logger.c | |
parent | 414c7b4ff70f4bbe934166709d29fc37389e20be (diff) | |
download | rspamd-09fc651620d5d55949fb0ad60e402fb5e62668e2.tar.gz rspamd-09fc651620d5d55949fb0ad60e402fb5e62668e2.zip |
[Minor] Allow to have __index in rspamd "classes"
Diffstat (limited to 'src/lua/lua_logger.c')
-rw-r--r-- | src/lua/lua_logger.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c index fc0f5fe9f..17705947b 100644 --- a/src/lua/lua_logger.c +++ b/src/lua/lua_logger.c @@ -389,7 +389,7 @@ static gsize lua_logger_out_userdata (lua_State *L, gint pos, gchar *outbuf, gsize len, struct lua_logger_trace *trace) { - gint r, top; + gint r = 0, top; const gchar *str = NULL; gboolean converted_to_str = FALSE; @@ -403,6 +403,32 @@ lua_logger_out_userdata (lua_State *L, gint pos, gchar *outbuf, gsize len, lua_gettable (L, -2); if (!lua_istable (L, -1)) { + + if (lua_isfunction (L, -1)) { + /* Functional metatable, try to get __tostring directly */ + lua_pushstring (L, "__tostring"); + lua_gettable (L, -3); + + if (lua_isfunction (L, -1)) { + lua_pushvalue (L, pos); + + if (lua_pcall (L, 1, 1, 0) != 0) { + lua_settop (L, top); + + return 0; + } + + str = lua_tostring (L, -1); + + if (str) { + r = rspamd_snprintf (outbuf, len, "%s", str); + } + + lua_settop (L, top); + + return r; + } + } lua_settop (L, top); return 0; |