From: Vsevolod Stakhov Date: Wed, 18 Jan 2017 18:54:31 +0000 (+0000) Subject: [Fix] Further memory leaks fixes X-Git-Tag: 1.5.0~306 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f3164efecab37a350abd79ad350840caaf6eb8f1;p=thirdparty%2Frspamd.git [Fix] Further memory leaks fixes --- diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index d3021570ec..8a72a8dd26 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -586,7 +586,7 @@ rspamd_rcl_worker_handler (rspamd_mempool_t *pool, const ucl_object_t *obj, qtype = g_quark_try_string (worker_type); if (qtype != 0) { wrk = rspamd_config_new_worker (cfg, NULL); - wrk->options = ucl_object_ref (obj); + wrk->options = ucl_object_copy (obj); wrk->worker = rspamd_get_worker_by_type (cfg, qtype); if (wrk->worker == NULL) { @@ -1588,7 +1588,7 @@ rspamd_rcl_neighbours_handler (rspamd_mempool_t *pool, } neigh = ucl_object_typed_new (UCL_OBJECT); - ucl_object_insert_key (neigh, ucl_object_ref (hostval), "host", 0, false); + ucl_object_insert_key (neigh, ucl_object_copy (hostval), "host", 0, false); if ((p = strrchr (ucl_object_tostring (hostval), ':')) != NULL) { if (g_ascii_isdigit (p[1])) { diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index 12a13cd9b1..e6b29edf8b 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -942,8 +942,7 @@ static void rspamd_worker_conf_dtor (struct rspamd_worker_conf *wcf) { if (wcf) { - /* XXX: fix reload memory leak somehow */ - /* ucl_object_unref (wcf->options); */ + ucl_object_unref (wcf->options); g_queue_free (wcf->active_workers); g_hash_table_unref (wcf->params); g_slice_free1 (sizeof (*wcf), wcf); diff --git a/src/libserver/re_cache.c b/src/libserver/re_cache.c index e5298ff048..8d914c93ab 100644 --- a/src/libserver/re_cache.c +++ b/src/libserver/re_cache.c @@ -154,6 +154,11 @@ rspamd_re_cache_destroy (struct rspamd_re_cache *cache) re_class = v; g_hash_table_iter_steal (&it); g_hash_table_unref (re_class->re); + + if (re_class->type_data) { + g_slice_free1 (re_class->type_len, re_class->type_data); + } + #ifdef WITH_HYPERSCAN if (re_class->hs_db) { hs_free_database (re_class->hs_db); diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c index 4e437d4167..48ef083292 100644 --- a/src/libutil/upstream.c +++ b/src/libutil/upstream.c @@ -80,6 +80,7 @@ struct upstream_ctx { guint dns_retransmits; GQueue *upstreams; gboolean configured; + rspamd_mempool_t *pool; ref_entry_t ref; }; @@ -144,6 +145,7 @@ rspamd_upstream_ctx_dtor (struct upstream_ctx *ctx) } g_queue_free (ctx->upstreams); + rspamd_mempool_delete (ctx->pool); g_slice_free1 (sizeof (*ctx), ctx); } @@ -165,6 +167,8 @@ rspamd_upstreams_library_init (void) ctx->dns_timeout = default_dns_timeout; ctx->revive_jitter = default_revive_jitter; ctx->revive_time = default_revive_time; + ctx->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), + "upstreams"); ctx->upstreams = g_queue_new (); REF_INIT_RETAIN (ctx, rspamd_upstream_ctx_dtor); @@ -549,7 +553,8 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups, if (!rspamd_parse_host_port_priority (str, &addrs, &up->weight, - &up->name, def_port, NULL)) { + &up->name, def_port, ups->ctx->pool)) { + g_slice_free1 (sizeof (*up), up); return FALSE; } @@ -558,8 +563,6 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups, addr = g_ptr_array_index (addrs, i); rspamd_upstream_add_addr (up, rspamd_inet_address_copy (addr)); } - - g_ptr_array_free (addrs, TRUE); } if (up->weight == 0 && ups->rot_alg == RSPAMD_UPSTREAM_MASTER_SLAVE) {