]> source.dussan.org Git - rspamd.git/commitdiff
Fix leaks in lua error paths
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 5 Feb 2016 12:42:43 +0000 (12:42 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 5 Feb 2016 13:39:12 +0000 (13:39 +0000)
20 files changed:
src/libmime/mime_expressions.c
src/libserver/cfg_rcl.c
src/libserver/cfg_utils.c
src/libserver/symbols_cache.c
src/libserver/task.c
src/lua/lua_buffer.c
src/lua/lua_classifier.c
src/lua/lua_common.c
src/lua/lua_config.c
src/lua/lua_dns.c
src/lua/lua_expression.c
src/lua/lua_http.c
src/lua/lua_mempool.c
src/lua/lua_redis.c
src/lua/lua_session.c
src/lua/lua_tcp.c
src/lua/lua_trie.c
src/lua_worker.c
src/plugins/regexp.c
src/rspamadm/rspamadm.c

index 411c301ebc353f82ebd1f56360db20a8b85a3a93..6a422e82e13c04c2fb0885d64e0a1acbc88055a3 100644 (file)
@@ -836,6 +836,7 @@ rspamd_mime_expr_process (gpointer input, rspamd_expression_atom_t *atom)
                                mime_atom->d.lua_function,
                                mime_atom->str,
                                lua_tostring (L, -1));
+                       lua_pop (L, 1);
                }
                else {
                        if (lua_type (L, -1) == LUA_TBOOLEAN) {
index df9768792fae17d6253b02e155a2de65f8c79c74..ffc6f908614b09c96ed57afaf3a748f51840041e 100644 (file)
@@ -772,7 +772,7 @@ rspamd_rcl_lua_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
                                                lua_src,
                                                tb->str);
                                g_string_free (tb, TRUE);
-                               lua_pop (L, 1);
+                               lua_pop (L, 2);
 
                                if (chdir (cur_dir) == -1) {
                                        msg_err_config ("cannot chdir to %s: %s", cur_dir,
index 6ecd7b429a0c79dcf2cdf8749c05b058a9ac90d6..66a67fe13ae3cd56deabedb442c75445755a14fa 100644 (file)
@@ -379,6 +379,8 @@ rspamd_config_process_var (struct rspamd_config *cfg, const rspamd_ftok_t *var,
                if (lua_pcall (cfg->lua_state, 0, 1, 0) != 0) {
                        msg_err_config ("error executing lua code: '%T': %s", content,
                                        lua_tostring (cfg->lua_state, -1));
+                       lua_pop (cfg->lua_state, 1);
+
                        return FALSE;
                }
 
index 53c065dfdcd9c0e16910813b22e5a96153c9a4c5..50012c1a9fb0b516d2284b584bba03c1fab5acc8 100644 (file)
@@ -1048,6 +1048,7 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
                        if (lua_pcall (L, 1, 1, 0) != 0) {
                                msg_info_task ("call to condition for %s failed: %s",
                                                item->symbol, lua_tostring (L, -1));
+                               lua_pop (L, 1);
                        }
                        else {
                                check = lua_toboolean (L, -1);
index 4194ac94ce1d6017eed4db10f1a96dfd956eb581..1220dc4bc9b3e5a2d6154e3b046f03db4c5f6e98 100644 (file)
@@ -1076,6 +1076,7 @@ rspamd_task_write_log (struct rspamd_task *task)
                        if (lua_pcall (L, 1, 1, 0) != 0) {
                                msg_err_task ("call to log function failed: %s",
                                                lua_tostring (L, -1));
+                               lua_pop (L, 1);
                        }
                        else {
                                lua_str = lua_tolstring (L, -1, &lua_str_len);
index aaa57f9d453a7be6f49748c65bae974b72a737a2..c644eae7de79266dc15e89917c5af5c354d75adb 100644 (file)
@@ -90,6 +90,7 @@ lua_io_read_cb (rspamd_ftok_t * in, void *arg)
        if (lua_pcall (cbdata->L, 2, 1, 0) != 0) {
                msg_info ("call to session finalizer failed: %s",
                        lua_tostring (cbdata->L, -1));
+               lua_pop (cbdata->L, 1);
        }
 
        res = lua_toboolean (cbdata->L, -1);
@@ -118,6 +119,7 @@ lua_io_write_cb (void *arg)
                if (lua_pcall (cbdata->L, 1, 1, 0) != 0) {
                        msg_info ("call to session finalizer failed: %s",
                                lua_tostring (cbdata->L, -1));
+                       lua_pop (cbdata->L, 1);
                }
 
                res = lua_toboolean (cbdata->L, -1);
@@ -144,6 +146,7 @@ lua_io_err_cb (GError * err, void *arg)
        if (lua_pcall (cbdata->L, 2, 0, 0) != 0) {
                msg_info ("call to session finalizer failed: %s",
                        lua_tostring (cbdata->L, -1));
+               lua_pop (cbdata->L, 1);
        }
 
        /* Unref callbacks */
index 64edea234ba90f825664f8ca4733250bbdc8c2a8..d8add5e4deac24e67df7617ce2f0abff9a2c3f47 100644 (file)
@@ -90,6 +90,7 @@ call_classifier_pre_callback (struct rspamd_classifier_config *ccf,
        if (lua_pcall (L, 4, 1, 0) != 0) {
                msg_warn_task ("error running pre classifier callback %s",
                        lua_tostring (L, -1));
+               lua_pop (L, 1);
        }
        else {
                if (lua_istable (L, -1)) {
@@ -102,6 +103,7 @@ call_classifier_pre_callback (struct rspamd_classifier_config *ccf,
                                lua_pop (L, 1);
                        }
                }
+               lua_pop (L, 1);
        }
 
        return res;
@@ -186,6 +188,7 @@ rspamd_lua_call_cls_post_callbacks (struct rspamd_classifier_config *ccf,
                if (lua_pcall (L, 3, 1, 0) != 0) {
                        msg_warn_task ("error running function %s: %s", cd->name,
                                lua_tostring (L, -1));
+                       lua_pop (L, 1);
                }
                else {
                        if (lua_isnumber (L, 1)) {
index 8899dc1168506cd7cbbfbf212dca80a33971d2be..eb3b7de3fbaebf9a21833df4940838f8c6ec6726 100644 (file)
@@ -344,7 +344,7 @@ rspamd_init_lua_filters (struct rspamd_config *cfg)
 gint
 rspamd_lua_call_filter (const gchar *function, struct rspamd_task *task)
 {
-       gint result;
+       gint result = 0;
        struct rspamd_task **ptask;
        lua_State *L = task->cfg->lua_state;
 
@@ -361,7 +361,10 @@ rspamd_lua_call_filter (const gchar *function, struct rspamd_task *task)
        if (!lua_isnumber (L, -1)) {
                msg_info_task ("function %s must return a number", function);
        }
-       result = lua_tonumber (L, -1);
+       else {
+               result = lua_tonumber (L, -1);
+       }
+
        lua_pop (L, 1);             /* pop returned value */
 
        return result;
index 7abaf3842601ef74ac696ae4453abc50b5bbc6e1..81595989831c1f02ee2ad61c5af4bad139d030d3 100644 (file)
@@ -636,6 +636,7 @@ rspamd_lua_call_post_filters (struct rspamd_task *task)
                                cd->cb_is_ref ? "local function" :
                                cd->callback.name,
                                lua_tostring (cd->L, -1));
+                       lua_pop (cd->L, 1);
                }
                cur = g_list_next (cur);
        }
@@ -704,6 +705,7 @@ rspamd_lua_call_pre_filters (struct rspamd_task *task)
                                cd->cb_is_ref ? "local function" :
                                cd->callback.name,
                                lua_tostring (cd->L, -1));
+                       lua_pop (cd->L, 1);
                }
                cur = g_list_next (cur);
        }
@@ -965,8 +967,9 @@ lua_metric_symbol_callback (struct rspamd_task *task, gpointer ud)
                                        }
                                        rspamd_task_insert_result (task, cd->symbol, flag, opts);
                                }
+
+                               lua_pop (L, nresults);
                        }
-                       lua_pop (L, nresults);
                }
        }
 
@@ -1718,6 +1721,7 @@ lua_map_fin (rspamd_mempool_t * pool, struct map_cb_data *data)
                if (lua_pcall (cbdata->L, 1, 0, 0) != 0) {
                        msg_info_pool ("call to %s failed: %s", "local function",
                                lua_tostring (cbdata->L, -1));
+                       lua_pop (cbdata->L, 1);
                }
        }
 }
index 2f2e54a1a80816451761962a29db6409a166a34e..c52569225dda1b25bc4ea76ddbeb7ee3bf49936d 100644 (file)
@@ -200,6 +200,7 @@ lua_dns_callback (struct rdns_reply *reply, gpointer arg)
 
        if (lua_pcall (cd->L, 5, 0, 0) != 0) {
                msg_info ("call to dns callback failed: %s", lua_tostring (cd->L, -1));
+               lua_pop (cd->L, 1);
        }
 
        /* Unref function */
index 5bb7293eb14025cf24e81a49b7fb7630cdf9da98..fe52e929bea029edd307f303586c225fab9fe8ec 100644 (file)
@@ -135,6 +135,8 @@ lua_atom_parse (const gchar *line, gsize len,
 
        if (lua_pcall (e->L, 1, 1, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (e->L, -1));
+               lua_pop (e->L, 1);
+               return NULL;
        }
 
        if (lua_type (e->L, -1) != LUA_TSTRING) {
@@ -158,7 +160,7 @@ static gint
 lua_atom_process (gpointer input, rspamd_expression_atom_t *atom)
 {
        struct lua_expression *e = (struct lua_expression *)atom->data;
-       gint ret;
+       gint ret = 0;
 
        lua_rawgeti (e->L, LUA_REGISTRYINDEX, e->process_idx);
        lua_pushlstring (e->L, atom->str, atom->len);
@@ -166,10 +168,12 @@ lua_atom_process (gpointer input, rspamd_expression_atom_t *atom)
 
        if (lua_pcall (e->L, 2, 1, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (e->L, -1));
+               lua_pop (e->L, 1);
+       }
+       else {
+               ret = lua_tonumber (e->L, -1);
+               lua_pop (e->L, 1);
        }
-
-       ret = lua_tonumber (e->L, -1);
-       lua_pop (e->L, 1);
 
        return ret;
 }
index 07a4cc28620e2d67d1a541750886d03ecbcf823f..5f2dd241646bf5b65522b09ba803c70a501f6e3c 100644 (file)
@@ -132,6 +132,7 @@ lua_http_push_error (struct lua_http_cbdata *cbd, const char *err)
 
        if (lua_pcall (cbd->L, 1, 0, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (cbd->L, -1));
+               lua_pop (cbd->L, 1);
        }
 }
 
@@ -167,6 +168,7 @@ lua_http_finish_handler (struct rspamd_http_connection *conn,
        }
        if (lua_pcall (cbd->L, 4, 0, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (cbd->L, -1));
+               lua_pop (cbd->L, 1);
        }
 
        lua_http_maybe_free (cbd);
index d5825d1e3cab6ef02f70c0c31abe1c86545a9100..00c2c24e0ea57746bb0e409011b9824c872c7120 100644 (file)
@@ -163,6 +163,7 @@ lua_mempool_destructor_func (gpointer p)
        lua_rawgeti (ud->L, LUA_REGISTRYINDEX, ud->cbref);
        if (lua_pcall (ud->L, 0, 0, 0) != 0) {
                msg_info ("call to destructor failed: %s", lua_tostring (ud->L, -1));
+               lua_pop (ud->L, 1);
        }
        luaL_unref (ud->L, LUA_REGISTRYINDEX, ud->cbref);
 }
index 24f3c93af908bd9244fb6756ad39d010ca19eb40..4e02107f5c75f95d80363644299c4c47cb9dafb0 100644 (file)
@@ -190,6 +190,7 @@ lua_redis_push_error (const gchar *err,
        lua_pushnil (ud->L);
        if (lua_pcall (ud->L, 3, 0, 0) != 0) {
                msg_info ("call to callback failed: %s", lua_tostring (ud->L, -1));
+               lua_pop (ud->L, 1);
        }
 
        if (connected) {
@@ -251,6 +252,7 @@ lua_redis_push_data (const redisReply *r, struct lua_redis_ctx *ctx)
 
        if (lua_pcall (ud->L, 3, 0, 0) != 0) {
                msg_info ("call to callback failed: %s", lua_tostring (ud->L, -1));
+               lua_pop (ud->L, 1);
        }
 
        rspamd_session_remove_event (ud->task->s, lua_redis_fin, ctx);
index 3d42bc80e8c773a61c7d3ceb35ad9e06404e469e..033ed892bc784f31bfc81a450ad887311b414cab 100644 (file)
@@ -89,9 +89,13 @@ lua_session_finalizer (gpointer ud)
        if (lua_pcall (cbdata->L, 0, 1, 0) != 0) {
                msg_info ("call to session finalizer failed: %s",
                        lua_tostring (cbdata->L, -1));
+               lua_pop (cbdata->L, 1);
        }
-       res = lua_toboolean (cbdata->L, -1);
-       lua_pop (cbdata->L, 1);
+       else {
+               res = lua_toboolean (cbdata->L, -1);
+               lua_pop (cbdata->L, 1);
+       }
+
        luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_fin);
 
 
@@ -110,6 +114,7 @@ lua_session_restore (gpointer ud)
                if (lua_pcall (cbdata->L, 0, 0, 0) != 0) {
                        msg_info ("call to session restorer failed: %s",
                                lua_tostring (cbdata->L, -1));
+                       lua_pop (cbdata->L, 1);
                }
                luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_restore);
        }
@@ -127,6 +132,7 @@ lua_session_cleanup (gpointer ud)
                if (lua_pcall (cbdata->L, 0, 0, 0) != 0) {
                        msg_info ("call to session cleanup failed: %s",
                                lua_tostring (cbdata->L, -1));
+                       lua_pop (cbdata->L, 1);
                }
                luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref_cleanup);
        }
@@ -224,6 +230,7 @@ lua_event_fin (gpointer ud)
                if (lua_pcall (cbdata->L, 0, 0, 0) != 0) {
                        msg_info ("call to event finalizer failed: %s",
                                lua_tostring (cbdata->L, -1));
+                       lua_pop (cbdata->L, 1);
                }
                luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref);
        }
index efe5cadfaa162b8c984e05838e970b2e954733e9..1745abdc9f286219fe862f66a724be9bdf5b1413 100644 (file)
@@ -127,6 +127,7 @@ lua_tcp_push_error (struct lua_tcp_cbdata *cbd, const char *err)
 
        if (lua_pcall (cbd->L, 1, 0, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (cbd->L, -1));
+               lua_pop (cbd->L, 1);
        }
 }
 
@@ -147,6 +148,7 @@ lua_tcp_push_data (struct lua_tcp_cbdata *cbd, const gchar *str, gsize len)
 
        if (lua_pcall (cbd->L, 2, 0, 0) != 0) {
                msg_info ("callback call failed: %s", lua_tostring (cbd->L, -1));
+               lua_pop (cbd->L, 1);
        }
 }
 
index 4f60663da4664782c029f8b3408f18d658465e16..987818608ebb86f805f4be5e04b5cc8dc029e473 100644 (file)
@@ -156,6 +156,7 @@ lua_trie_callback (int strnum, int textpos, void *context)
        if (lua_pcall (L, 2, 1, 0) != 0) {
                msg_info ("call to trie callback has failed: %s",
                        lua_tostring (L, -1));
+               lua_pop (L, 1);
 
                return 1;
        }
index cb052463818fb336796680c646a56474f820fd00..60456b59fa1cb57bfa7bdd8d2bc91ed0c2de2cbc 100644 (file)
@@ -286,6 +286,7 @@ lua_accept_socket (gint fd, short what, void *arg)
 
        if (lua_pcall (L, 4, 0, 0) != 0) {
                msg_info ("call to worker accept failed: %s", lua_tostring (L, -1));
+               lua_pop (L, 1);
        }
 
        rspamd_inet_address_destroy (addr);
@@ -402,6 +403,7 @@ start_lua_worker (struct rspamd_worker *worker)
                if (lua_pcall (L, 1, 0, 0) != 0) {
                        msg_info ("call to worker finalizer failed: %s", lua_tostring (L,
                                -1));
+                       lua_pop (L, 1);
                }
                /* Free resources */
                luaL_unref (L, LUA_REGISTRYINDEX, ctx->cbref_fin);
index 00c7ec470cc9113396e8fe98289ea5fb78321aaf..7273d87d79c9a74ca05ab7f77aad8e0fd4f401f7 100644 (file)
@@ -343,8 +343,11 @@ rspamd_lua_call_expression_func (struct ucl_lua_funcdata *lua_data,
        if (lua_pcall (L, nargs + 1, 1, 0) != 0) {
                msg_info_task ("%s: call to lua function failed: %s", symbol,
                                lua_tostring (L, -1));
+               lua_pop (L, 1);
+
                return FALSE;
        }
+
        pop++;
 
        if (lua_type (L, -1) == LUA_TNUMBER) {
index 37b4557889a8d103fc06be4df6b96aa9aa8a6e00..d91b6630463c683d6f6db3647f7d03b6276f6dd9 100644 (file)
@@ -248,7 +248,7 @@ rspamadm_execute_lua_ucl_subr (gpointer pL, gint argc, gchar **argv,
                        g_string_free (tb, TRUE);
                }
 
-               lua_pop (L, 1);
+               lua_pop (L, 2);
 
                return FALSE;
        }