]> source.dussan.org Git - rspamd.git/commitdiff
[Project] Make SPF module reentrant
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Jul 2018 13:57:24 +0000 (14:57 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 30 Jul 2018 13:57:24 +0000 (14:57 +0100)
src/plugins/spf.c

index 5bdf044888c8b35cd25d23f2ba7f0a5ec1512b8f..683683a552ff85817304f644242e028d509ecdd9 100644 (file)
@@ -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,