]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Improve lua logging escaping
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 29 Apr 2019 13:52:25 +0000 (14:52 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 29 Apr 2019 13:52:25 +0000 (14:52 +0100)
src/lua/lua_common.h
src/lua/lua_logger.c
src/rspamadm/lua_repl.c

index d9bbff585176c8c22ed99adb0b1ff9529e92b33e..5ff5cc8bf77689daeff37a908c8c83911a3ab740 100644 (file)
@@ -365,6 +365,16 @@ struct lua_logger_trace {
        gconstpointer traces[TRACE_POINTS];
 };
 
+enum lua_logger_escape_type {
+       LUA_ESCAPE_NONE = (0u),
+       LUA_ESCAPE_UNPRINTABLE = (1u << 0u),
+       LUA_ESCAPE_NEWLINES = (1u << 1u),
+       LUA_ESCAPE_8BIT = (1u << 2u),
+};
+
+#define LUA_ESCAPE_LOG (LUA_ESCAPE_UNPRINTABLE|LUA_ESCAPE_NEWLINES)
+#define LUA_ESCAPE_ALL (LUA_ESCAPE_UNPRINTABLE|LUA_ESCAPE_NEWLINES|LUA_ESCAPE_8BIT)
+
 /**
  * Log lua object to string
  * @param L
@@ -374,7 +384,8 @@ struct lua_logger_trace {
  * @return
  */
 gsize lua_logger_out_type (lua_State *L, gint pos, gchar *outbuf,
-               gsize len, struct lua_logger_trace *trace);
+                                                  gsize len, struct lua_logger_trace *trace,
+                                                  enum lua_logger_escape_type esc_type);
 
 /**
  * Safely checks userdata to match specified class
index 9d25fce6a180faf6149a361c73bfae14977e544d..60c702e65218ea3df2ae856e36f4e61c0f39e86a 100644 (file)
@@ -269,9 +269,37 @@ lua_logger_debug (lua_State *L)
        return 0;
 }
 
+static inline bool
+lua_logger_char_safe (int t, unsigned int esc_type)
+{
+       if (t & 0x80) {
+               if (esc_type & LUA_ESCAPE_8BIT) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       if (esc_type & LUA_ESCAPE_UNPRINTABLE) {
+               if (!g_ascii_isprint (t) && !g_ascii_isspace (t)) {
+                       return false;
+               }
+       }
+
+       if (esc_type & LUA_ESCAPE_NEWLINES) {
+               if (t == '\r' || t == '\n') {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
 static gsize
-lua_logger_out_str (lua_State *L, gint pos, gchar *outbuf, gsize len,
-                                       struct lua_logger_trace *trace)
+lua_logger_out_str (lua_State *L, gint pos,
+                                       gchar *outbuf, gsize len,
+                                       struct lua_logger_trace *trace,
+                                       enum lua_logger_escape_type esc_type)
 {
        gsize slen, flen;
        const gchar *str = lua_tolstring (L, pos, &slen);
@@ -283,7 +311,7 @@ lua_logger_out_str (lua_State *L, gint pos, gchar *outbuf, gsize len,
                flen = MIN (slen, len - 1);
 
                for (r = 0; r < flen; r ++) {
-                       if (!(g_ascii_isprint (str[r]) || (str[r] & 0x80))) {
+                       if (!lua_logger_char_safe (str[r], esc_type)) {
                                normal = FALSE;
                                break;
                        }
@@ -298,11 +326,8 @@ lua_logger_out_str (lua_State *L, gint pos, gchar *outbuf, gsize len,
                        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) {
+                               if (!lua_logger_char_safe (str[r], esc_type)) {
+                                       if (len >= 3) {
                                                outbuf[r++] = '\\';
                                                outbuf[r++] = hexdigests[((str[s] >> 4) & 0xF)];
                                                outbuf[r++] = hexdigests[((str[s]) & 0xF)];
@@ -431,7 +456,8 @@ lua_logger_out_userdata (lua_State *L, gint pos, gchar *outbuf, gsize len,
 
 static gsize
 lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len,
-                                         struct lua_logger_trace *trace)
+                                         struct lua_logger_trace *trace,
+                                         enum lua_logger_escape_type esc_type)
 {
        gchar *d = outbuf;
        gsize remain = len, r;
@@ -485,7 +511,7 @@ lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len,
                        r = rspamd_snprintf (d, remain + 1, "__self");
                }
                else {
-                       r = lua_logger_out_type (L, tpos, d, remain, trace);
+                       r = lua_logger_out_type (L, tpos, d, remain, trace, esc_type);
                }
                MOVE_BUF(d, remain, r);
 
@@ -515,7 +541,7 @@ lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len,
                        r = rspamd_snprintf (d, remain + 1, "__self");
                }
                else {
-                       r = lua_logger_out_type (L, tpos, d, remain, trace);
+                       r = lua_logger_out_type (L, tpos, d, remain, trace, esc_type);
                }
                MOVE_BUF(d, remain, r);
 
@@ -533,8 +559,10 @@ lua_logger_out_table (lua_State *L, gint pos, gchar *outbuf, gsize len,
 #undef MOVE_BUF
 
 gsize
-lua_logger_out_type (lua_State *L, gint pos, gchar *outbuf, gsize len,
-                                        struct lua_logger_trace *trace)
+lua_logger_out_type (lua_State *L, gint pos,
+                                        gchar *outbuf, gsize len,
+                                        struct lua_logger_trace *trace,
+                                        enum lua_logger_escape_type esc_type)
 {
        gint type;
        gsize r = 0;
@@ -554,7 +582,7 @@ lua_logger_out_type (lua_State *L, gint pos, gchar *outbuf, gsize len,
                        r = lua_logger_out_boolean (L, pos, outbuf, len, trace);
                        break;
                case LUA_TTABLE:
-                       r = lua_logger_out_table (L, pos, outbuf, len, trace);
+                       r = lua_logger_out_table (L, pos, outbuf, len, trace, esc_type);
                        break;
                case LUA_TUSERDATA:
                        r = lua_logger_out_userdata (L, pos, outbuf, len, trace);
@@ -570,7 +598,7 @@ lua_logger_out_type (lua_State *L, gint pos, gchar *outbuf, gsize len,
                        break;
                default:
                        /* Try to push everything as string using tostring magic */
-                       r = lua_logger_out_str (L, pos, outbuf, len, trace);
+                       r = lua_logger_out_str (L, pos, outbuf, len, trace, esc_type);
                        break;
        }
 
@@ -747,7 +775,8 @@ lua_logger_log_format (lua_State *L, gint fmt_pos, gboolean is_string,
                                }
 
                                memset (&tr, 0, sizeof (tr));
-                               r = lua_logger_out_type (L, arg_num + 1, d, remain, &tr);
+                               r = lua_logger_out_type (L, arg_num + 1, d, remain, &tr,
+                                               is_string ? LUA_ESCAPE_UNPRINTABLE : LUA_ESCAPE_LOG);
                                g_assert (r <= remain);
                                remain -= r;
                                d += r;
@@ -775,7 +804,8 @@ lua_logger_log_format (lua_State *L, gint fmt_pos, gboolean is_string,
                }
 
                memset (&tr, 0, sizeof (tr));
-               r = lua_logger_out_type (L, arg_num + 1, d, remain, &tr);
+               r = lua_logger_out_type (L, arg_num + 1, d, remain, &tr,
+                               is_string ? LUA_ESCAPE_UNPRINTABLE : LUA_ESCAPE_LOG);
                g_assert (r <= remain);
                remain -= r;
                d += r;
index 430c800f91e3925427f1e9d7e85552ad207f7563..43c97d01f421356730d1b68226126af581e01bb8 100644 (file)
@@ -282,7 +282,8 @@ rspamadm_exec_input (lua_State *L, const gchar *input)
                                        rspamd_printf ("local function: %d\n", cbref);
                                } else {
                                        memset (&tr, 0, sizeof (tr));
-                                       lua_logger_out_type (L, i, outbuf, sizeof (outbuf), &tr);
+                                       lua_logger_out_type (L, i, outbuf, sizeof (outbuf), &tr,
+                                                       LUA_ESCAPE_UNPRINTABLE);
                                        rspamd_printf ("%s\n", outbuf);
                                }
                        }
@@ -462,7 +463,8 @@ rspamadm_lua_message_handler (lua_State *L, gint argc, gchar **argv)
 
                                for (j = old_top + 1; j <= lua_gettop (L); j ++) {
                                        memset (&tr, 0, sizeof (tr));
-                                       lua_logger_out_type (L, j, outbuf, sizeof (outbuf), &tr);
+                                       lua_logger_out_type (L, j, outbuf, sizeof (outbuf), &tr,
+                                                       LUA_ESCAPE_UNPRINTABLE);
                                        rspamd_printf ("%s\n", outbuf);
                                }
                        }