diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-04-02 16:26:21 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-04-02 16:26:21 +0100 |
commit | a76eda3c01c89242c2a63b71ca447dbdf67b4e74 (patch) | |
tree | 457c3bfbe2b65640010ac09ab6d6745a78acf587 /src/lua/lua_logger.c | |
parent | 186c9a09975de2644e3674a43f6dbb28bc0159c8 (diff) | |
download | rspamd-a76eda3c01c89242c2a63b71ca447dbdf67b4e74.tar.gz rspamd-a76eda3c01c89242c2a63b71ca447dbdf67b4e74.zip |
[Feature] Improve lua binary strings output
Diffstat (limited to 'src/lua/lua_logger.c')
-rw-r--r-- | src/lua/lua_logger.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/lua/lua_logger.c b/src/lua/lua_logger.c index 20b59efa7..67b70eaad 100644 --- a/src/lua/lua_logger.c +++ b/src/lua/lua_logger.c @@ -273,12 +273,57 @@ static gsize lua_logger_out_str (lua_State *L, gint pos, gchar *outbuf, gsize len, struct lua_logger_trace *trace) { - gsize slen; + gsize slen, flen; const gchar *str = lua_tolstring (L, pos, &slen); - gsize r = 0; + static const gchar hexdigests[16] = "0123456789abcdef"; + gsize r = 0, s; if (str) { - r = rspamd_strlcpy (outbuf, str, MIN (slen, len) + 1); + gboolean normal = TRUE; + flen = MIN (slen, len - 1); + + for (r = 0; r < flen; r ++) { + if (!(g_ascii_isprint (str[r]) || (str[r] & 0x80))) { + normal = FALSE; + break; + } + } + + if (normal) { + r = rspamd_strlcpy (outbuf, str, flen + 1); + } + else { + /* Need to escape non printed characters */ + r = 0; + s = 0; + + while (slen > 0 && len > 1) { + if (!g_ascii_isprint (str[s])) { + if (str[s] & 0x80) { + outbuf[r++] = str[s]; + } + else if (len >= 3) { + outbuf[r++] = '\\'; + outbuf[r++] = hexdigests[((str[s] >> 4) & 0xF)]; + outbuf[r++] = hexdigests[((str[s]) & 0xF)]; + + len -= 2; + } + else { + outbuf[r++] = '?'; + } + } + else { + outbuf[r++] = str[s]; + } + + s++; + slen --; + len --; + } + + outbuf[r] = '\0'; + } } return r; |