From d0a4d803ecfb7934ccd4e665e8b0919eaa2a8d3c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 30 Jul 2018 14:57:24 +0100 Subject: [PATCH] [Project] Make SPF module reentrant --- src/plugins/spf.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/plugins/spf.c b/src/plugins/spf.c index 5bdf04488..683683a55 100644 --- a/src/plugins/spf.c +++ b/src/plugins/spf.c @@ -62,7 +62,12 @@ struct spf_ctx { gboolean check_authed; }; -static struct spf_ctx *spf_module_ctx = NULL; +static inline struct spf_ctx * +spf_get_context (struct rspamd_config *cfg) +{ + return (struct spf_ctx *)g_hash_table_lookup (cfg->c_modules, "spf"); +} + static void spf_symbol_callback (struct rspamd_task *task, void *unused); @@ -83,10 +88,10 @@ module_t spf_module = { gint spf_module_init (struct rspamd_config *cfg, struct module_ctx **ctx) { - if (spf_module_ctx == NULL) { - spf_module_ctx = g_malloc0 (sizeof (struct spf_ctx)); - } + struct spf_ctx *spf_module_ctx; + spf_module_ctx = rspamd_mempool_alloc0 (cfg->cfg_pool, + sizeof (*spf_module_ctx)); *ctx = (struct module_ctx *)spf_module_ctx; rspamd_rcl_add_doc_by_path (cfg, @@ -191,6 +196,7 @@ spf_module_config (struct rspamd_config *cfg) const ucl_object_t *value; gint res = TRUE, cb_id; guint cache_size; + struct spf_ctx *spf_module_ctx = spf_get_context (cfg); if (!rspamd_config_is_module_enabled (cfg, "spf")) { return TRUE; @@ -320,19 +326,19 @@ spf_module_config (struct rspamd_config *cfg) msg_info_config ("init internal spf module"); + rspamd_mempool_add_destructor (cfg->cfg_pool, + (rspamd_mempool_destruct_t)rspamd_lru_hash_destroy, + spf_module_ctx->spf_hash); + rspamd_mempool_add_destructor (cfg->cfg_pool, + (rspamd_mempool_destruct_t)rspamd_map_helper_destroy_radix, + spf_module_ctx->whitelist_ip); + return res; } gint spf_module_reconfig (struct rspamd_config *cfg) { - struct module_ctx saved_ctx; - - saved_ctx = spf_module_ctx->ctx; - rspamd_lru_hash_destroy (spf_module_ctx->spf_hash); - rspamd_map_helper_destroy_radix (spf_module_ctx->whitelist_ip); - memset (spf_module_ctx, 0, sizeof (*spf_module_ctx)); - spf_module_ctx->ctx = saved_ctx; return spf_module_config (cfg); } @@ -345,6 +351,7 @@ spf_check_element (struct spf_resolved *rec, struct spf_addr *addr, gchar *spf_result; guint af, mask, bmask, addrlen; const gchar *spf_message, *spf_symbol; + struct spf_ctx *spf_module_ctx = spf_get_context (task->cfg); if (task->from_addr == NULL) { return FALSE; @@ -491,6 +498,7 @@ spf_plugin_callback (struct spf_resolved *record, struct rspamd_task *task, { struct spf_resolved *l; struct rspamd_async_watcher *w = ud; + struct spf_ctx *spf_module_ctx = spf_get_context (task->cfg); if (record && record->na) { rspamd_task_insert_result (task, @@ -550,6 +558,7 @@ spf_symbol_callback (struct rspamd_task *task, void *unused) struct spf_resolved *l; struct rspamd_async_watcher *w; gint *dmarc_checks; + struct spf_ctx *spf_module_ctx = spf_get_context (task->cfg); /* Allow dmarc */ dmarc_checks = rspamd_mempool_get_variable (task->task_pool, -- 2.39.5