diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-01-17 19:19:47 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-01-17 19:19:47 +0000 |
commit | 7d40df5184f0aa6facde77e088d0751d4c475c6a (patch) | |
tree | 8c54b8eb817da0dee480bebd66d46bd83ee73898 /src/lua | |
parent | 6eec897d8c3e01159556f41b8bb938cacfc0c084 (diff) | |
download | rspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.tar.gz rspamd-7d40df5184f0aa6facde77e088d0751d4c475c6a.zip |
[Fix] Various reload leak fixing
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_common.c | 28 | ||||
-rw-r--r-- | src/lua/lua_common.h | 9 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/lua/lua_common.c b/src/lua/lua_common.c index b9eabe790..7f4cea7b7 100644 --- a/src/lua/lua_common.c +++ b/src/lua/lua_common.c @@ -1264,3 +1264,31 @@ lua_worker_get_pid (lua_State *L) return 1; } + +struct rspamd_lua_ref_cbdata { + lua_State *L; + gint cbref; +}; + +static void +rspamd_lua_ref_dtor (gpointer p) +{ + struct rspamd_lua_ref_cbdata *cbdata = p; + + luaL_unref (cbdata->L, LUA_REGISTRYINDEX, cbdata->cbref); +} + +void +rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, + gint ref) +{ + struct rspamd_lua_ref_cbdata *cbdata; + + if (ref != -1) { + cbdata = rspamd_mempool_alloc (pool, sizeof (*cbdata)); + cbdata->cbref = ref; + cbdata->L = L; + + rspamd_mempool_add_destructor (pool, rspamd_lua_ref_dtor, cbdata); + } +} diff --git a/src/lua/lua_common.h b/src/lua/lua_common.h index dbb46c822..ecf46d32e 100644 --- a/src/lua/lua_common.h +++ b/src/lua/lua_common.h @@ -360,5 +360,14 @@ void lua_call_finish_script (lua_State *L, struct gboolean rspamd_lua_run_postloads (lua_State *L, struct rspamd_config *cfg, struct event_base *ev_base, struct rspamd_worker *w); +/** + * Adds new destructor for a local function for specific pool + * @param L + * @param pool + * @param ref + */ +void rspamd_lua_add_ref_dtor (lua_State *L, rspamd_mempool_t *pool, + gint ref); + #endif /* WITH_LUA */ #endif /* RSPAMD_LUA_H */ |