enum rspamd_config_init_flags {
- RSPAMD_CONFIG_INIT_DEFAULT = 0,
- RSPAMD_CONFIG_INIT_SKIP_LUA = (1 << 0)
+ RSPAMD_CONFIG_INIT_DEFAULT = 0u,
+ RSPAMD_CONFIG_INIT_SKIP_LUA = (1u << 0u),
+ RSPAMD_CONFIG_INIT_WIPE_LUA_MEM = (1u << 1u),
};
/**
* Init default values
cfg->max_word_len = DEFAULT_MAX_WORD;
if (!(flags & RSPAMD_CONFIG_INIT_SKIP_LUA)) {
- cfg->lua_state = rspamd_lua_init ();
+ cfg->lua_state = rspamd_lua_init (flags & RSPAMD_CONFIG_INIT_WIPE_LUA_MEM);
cfg->own_lua_state = TRUE;
cfg->lua_thread_pool = lua_thread_pool_new (cfg->lua_state);
}
}
#endif
+
+
+static void *
+rspamd_lua_wipe_realloc (void *ud,
+ void *ptr,
+ size_t osize,
+ size_t nsize) RSPAMD_ATTR_ALLOC_SIZE(4);
+static void *
+rspamd_lua_wipe_realloc (void *ud,
+ void *ptr,
+ size_t osize,
+ size_t nsize)
+{
+ if (nsize == 0) {
+ if (ptr) {
+ rspamd_explicit_memzero (ptr, osize);
+ }
+
+ free (ptr);
+ }
+ else if (ptr == NULL) {
+ return malloc (nsize);
+ }
+ else {
+ return realloc (ptr, nsize);
+ }
+
+ return NULL;
+}
+
lua_State *
-rspamd_lua_init ()
+rspamd_lua_init (bool wipe_mem)
{
lua_State *L;
- L = luaL_newstate ();
+ if (wipe_mem) {
+ L = lua_newstate (rspamd_lua_wipe_realloc, NULL);
+ }
+ else {
+ L = luaL_newstate ();
+ }
+
luaL_openlibs (L);
luaopen_logger (L);
luaopen_mempool (L);
struct lua_locked_state *new;
new = g_malloc0 (sizeof (struct lua_locked_state));
- new->L = rspamd_lua_init ();
+ new->L = rspamd_lua_init (false);
new->m = rspamd_mutex_new ();
return new;
/**
* Initialize lua and bindings
*/
-lua_State *rspamd_lua_init (void);
+lua_State *rspamd_lua_init (bool wipe_mem);
/**
ucl_vars = g_hash_table_new_full (rspamd_strcase_hash,
rspamd_strcase_equal, g_free, g_free);
process_quark = g_quark_from_static_string ("rspamadm");
- cfg = rspamd_config_new (RSPAMD_CONFIG_INIT_DEFAULT);
+ cfg = rspamd_config_new (RSPAMD_CONFIG_INIT_DEFAULT|RSPAMD_CONFIG_INIT_WIPE_LUA_MEM);
cfg->libs_ctx = rspamd_init_libs ();
rspamd_main = g_malloc0 (sizeof (*rspamd_main));
rspamd_main->cfg = cfg;
void
rspamd_lua_test_func (void)
{
- lua_State *L = rspamd_lua_init ();
+ lua_State *L = rspamd_lua_init (false);
gchar *rp, rp_buf[PATH_MAX], path_buf[PATH_MAX], *tmp, *dir, *pattern;
const gchar *old_path;
glob_t globbuf;