]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix memory leak on reload in plugins
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 17 Jan 2017 16:53:20 +0000 (16:53 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 17 Jan 2017 16:53:20 +0000 (16:53 +0000)
src/plugins/chartable.c
src/plugins/dkim_check.c
src/plugins/fuzzy_check.c
src/plugins/regexp.c
src/plugins/spf.c

index bfc5d23788d1d66559a6617cc4268a05ded715c6..3b5a0f717773c1049e5a945866e41be7d3587d8c 100644 (file)
@@ -78,10 +78,12 @@ static void chartable_url_symbol_callback (struct rspamd_task *task, void *unuse
 gint
 chartable_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
 {
-       chartable_module_ctx = g_malloc (sizeof (struct chartable_ctx));
+       if (chartable_module_ctx == NULL) {
+               chartable_module_ctx = g_malloc (sizeof (struct chartable_ctx));
 
-       chartable_module_ctx->chartable_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
-       chartable_module_ctx->max_word_len = 10;
+               chartable_module_ctx->chartable_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+               chartable_module_ctx->max_word_len = 10;
+       }
 
        *ctx = (struct module_ctx *)chartable_module_ctx;
 
index 039c12c3f3abe6f556fa1c47b4af21ed029e1da7..6b10b2aa9617946eb5ed9687b0917e626b027671 100644 (file)
@@ -115,16 +115,18 @@ dkim_module_key_dtor (gpointer k)
 gint
 dkim_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
 {
-       dkim_module_ctx = g_malloc0 (sizeof (struct dkim_ctx));
-
-       dkim_module_ctx->dkim_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "dkim");
-       dkim_module_ctx->sign_headers = "from:sender:reply-to:subject:date:message-id:"
-                       "to:cc:mime-version:content-type:content-transfer-encoding:"
-                       "resent-to:resent-cc:resent-from:resent-sender:resent-message-id:"
-                       "in-reply-to:references:list-id:list-owner:list-unsubscribe:"
-                       "list-subscribe:list-post";
-       dkim_module_ctx->sign_condition_ref = -1;
-       dkim_module_ctx->max_sigs = DEFAULT_MAX_SIGS;
+       if (dkim_module_ctx == NULL) {
+               dkim_module_ctx = g_malloc0 (sizeof (struct dkim_ctx));
+
+               dkim_module_ctx->dkim_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "dkim");
+               dkim_module_ctx->sign_headers = "from:sender:reply-to:subject:date:message-id:"
+                               "to:cc:mime-version:content-type:content-transfer-encoding:"
+                               "resent-to:resent-cc:resent-from:resent-sender:resent-message-id:"
+                               "in-reply-to:references:list-id:list-owner:list-unsubscribe:"
+                               "list-subscribe:list-post";
+               dkim_module_ctx->sign_condition_ref = -1;
+               dkim_module_ctx->max_sigs = DEFAULT_MAX_SIGS;
+       }
 
        *ctx = (struct module_ctx *)dkim_module_ctx;
 
index 26ad295faf705606fee775c685127f67d9f1b4d5..e6a7b1bc1093d44b98c757d5dc509db3b606f71d 100644 (file)
@@ -637,13 +637,16 @@ fuzzy_check_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
 {
        lua_State *L = cfg->lua_state;
 
-       fuzzy_module_ctx = g_malloc0 (sizeof (struct fuzzy_ctx));
+       if (fuzzy_module_ctx == NULL) {
+               fuzzy_module_ctx = g_malloc0 (sizeof (struct fuzzy_ctx));
+
+               fuzzy_module_ctx->fuzzy_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+               /* TODO: this should match rules count actually */
+               fuzzy_module_ctx->keypairs_cache = rspamd_keypair_cache_new (32);
+               fuzzy_module_ctx->fuzzy_rules = g_ptr_array_new ();
+       }
 
-       fuzzy_module_ctx->fuzzy_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
        fuzzy_module_ctx->cfg = cfg;
-       /* TODO: this should match rules count actually */
-       fuzzy_module_ctx->keypairs_cache = rspamd_keypair_cache_new (32);
-       fuzzy_module_ctx->fuzzy_rules = g_ptr_array_new ();
 
        *ctx = (struct module_ctx *)fuzzy_module_ctx;
 
@@ -1043,10 +1046,12 @@ fuzzy_check_module_reconfig (struct rspamd_config *cfg)
        saved_ctx = fuzzy_module_ctx->ctx;
        rspamd_mempool_delete (fuzzy_module_ctx->fuzzy_pool);
        rspamd_keypair_cache_destroy (fuzzy_module_ctx->keypairs_cache);
+       g_ptr_array_free (fuzzy_module_ctx->fuzzy_rules, TRUE);
        memset (fuzzy_module_ctx, 0, sizeof (*fuzzy_module_ctx));
        fuzzy_module_ctx->ctx = saved_ctx;
        fuzzy_module_ctx->fuzzy_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
        fuzzy_module_ctx->cfg = cfg;
+       fuzzy_module_ctx->fuzzy_rules = g_ptr_array_new ();
        fuzzy_module_ctx->keypairs_cache = rspamd_keypair_cache_new (32);
 
        return fuzzy_check_module_config (cfg);
index a88bde21b545d7618c3d7d07e3a76b72229e5477..f2d3ab2c3f85e0ca1f11acf4b7422e6b5f04cab3 100644 (file)
@@ -91,9 +91,10 @@ read_regexp_expression (rspamd_mempool_t * pool,
 gint
 regexp_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
 {
-       regexp_module_ctx = g_malloc (sizeof (struct regexp_ctx));
-
-       regexp_module_ctx->regexp_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+       if (regexp_module_ctx == NULL) {
+               regexp_module_ctx = g_malloc (sizeof (struct regexp_ctx));
+               regexp_module_ctx->regexp_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+       }
 
        *ctx = (struct module_ctx *)regexp_module_ctx;
 
index e51016429b7a0ca7079c653be08f175d61fa2017..15ebdab31ccf35ff3e0a745ca4ce2c1bcb9054cf 100644 (file)
@@ -83,9 +83,11 @@ module_t spf_module = {
 gint
 spf_module_init (struct rspamd_config *cfg, struct module_ctx **ctx)
 {
-       spf_module_ctx = g_malloc (sizeof (struct spf_ctx));
+       if (spf_module_ctx == NULL) {
+               spf_module_ctx = g_malloc (sizeof (struct spf_ctx));
 
-       spf_module_ctx->spf_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+               spf_module_ctx->spf_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+       }
 
        *ctx = (struct module_ctx *)spf_module_ctx;