diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-01-18 17:42:29 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-01-18 17:42:29 +0000 |
commit | 87be736a89369f4c746e5a97352000eceaabac3a (patch) | |
tree | 80ecff5c1e2d79cc0a49032520537c0ba292b2fa | |
parent | 9d090bfa97a3de12fbc6123def434609349b9031 (diff) | |
download | rspamd-87be736a89369f4c746e5a97352000eceaabac3a.tar.gz rspamd-87be736a89369f4c746e5a97352000eceaabac3a.zip |
[Fix] More leaks eliminated
-rw-r--r-- | src/libserver/cfg_rcl.c | 8 | ||||
-rw-r--r-- | src/libutil/addr.c | 8 | ||||
-rw-r--r-- | src/libutil/expression.c | 2 | ||||
-rw-r--r-- | src/libutil/map.c | 19 | ||||
-rw-r--r-- | src/lua/lua_map.c | 7 | ||||
-rw-r--r-- | src/plugins/fuzzy_check.c | 2 | ||||
-rw-r--r-- | src/rspamd.c | 3 |
7 files changed, 35 insertions, 14 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 48ecb94da..d3021570e 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -1184,7 +1184,7 @@ rspamd_rcl_statfile_handler (rspamd_mempool_t *pool, const ucl_object_t *obj, st->symbol = rspamd_mempool_strdup (cfg->cfg_pool, key); if (rspamd_rcl_section_parse_defaults (cfg, section, pool, obj, st, err)) { - ccf->statfiles = g_list_prepend (ccf->statfiles, st); + ccf->statfiles = rspamd_mempool_glist_prepend (pool, ccf->statfiles, st); if (st->label != NULL) { labels = g_hash_table_lookup (ccf->labels, st->label); @@ -1196,6 +1196,7 @@ rspamd_rcl_statfile_handler (rspamd_mempool_t *pool, const ucl_object_t *obj, g_list_prepend (NULL, st)); } } + if (st->symbol != NULL) { g_hash_table_insert (cfg->classifiers_symbols, st->symbol, st); } @@ -1392,7 +1393,10 @@ rspamd_rcl_classifier_handler (rspamd_mempool_t *pool, } ref_idx = luaL_ref (L, LUA_REGISTRYINDEX); - ccf->learn_conditions = g_list_append (ccf->learn_conditions, + rspamd_lua_add_ref_dtor (L, cfg->cfg_pool, ref_idx); + ccf->learn_conditions = rspamd_mempool_glist_append ( + cfg->cfg_pool, + ccf->learn_conditions, GINT_TO_POINTER (ref_idx)); lua_settop (L, 0); } diff --git a/src/libutil/addr.c b/src/libutil/addr.c index c72727c38..d02e43985 100644 --- a/src/libutil/addr.c +++ b/src/libutil/addr.c @@ -1020,7 +1020,13 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, hints.ai_flags = AI_NUMERICSERV|flags; if (len > 0) { - addr_cpy = g_malloc (len + 1); + if (pool) { + addr_cpy = rspamd_mempool_alloc (pool, len + 1); + } + else { + addr_cpy = g_malloc (len + 1); + } + rspamd_strlcpy (addr_cpy, begin, len + 1); } /* Otherwise it will be NULL */ diff --git a/src/libutil/expression.c b/src/libutil/expression.c index 8562ca36c..adc926e53 100644 --- a/src/libutil/expression.c +++ b/src/libutil/expression.c @@ -379,6 +379,8 @@ rspamd_ast_add_node (GPtrArray *operands, struct rspamd_expression_elt *op, if (a1 == NULL) { g_set_error (err, rspamd_expr_quark(), EINVAL, "no operand to " "unary '%s' operation", rspamd_expr_op_to_str (op->p.op)); + g_node_destroy (res); + return FALSE; } diff --git a/src/libutil/map.c b/src/libutil/map.c index af76c6979..3266b5cf3 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -1603,7 +1603,8 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, g_ptr_array_add (map->backends, bk); if (!map->name) { - map->name = g_strdup (ucl_object_tostring (cur)); + map->name = rspamd_mempool_strdup (cfg->cfg_pool, + ucl_object_tostring (cur)); } } } @@ -1621,16 +1622,14 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, else if (ucl_object_type (obj) == UCL_OBJECT) { elt = ucl_object_lookup (obj, "name"); if (elt && ucl_object_type (elt) == UCL_STRING) { - map->name = g_strdup (ucl_object_tostring (elt)); + map->name = rspamd_mempool_strdup (cfg->cfg_pool, + ucl_object_tostring (elt)); } elt = ucl_object_lookup (obj, "description"); if (elt && ucl_object_type (elt) == UCL_STRING) { - if (map->description) { - g_free (map->description); - } - - map->description = g_strdup (ucl_object_tostring (elt)); + map->description = rspamd_mempool_strdup (cfg->cfg_pool, + ucl_object_tostring (elt)); } elt = ucl_object_lookup_any (obj, "timeout", "poll", "poll_time", @@ -1657,7 +1656,8 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, g_ptr_array_add (map->backends, bk); if (!map->name) { - map->name = g_strdup (ucl_object_tostring (cur)); + map->name = rspamd_mempool_strdup (cfg->cfg_pool, + ucl_object_tostring (cur)); } } } @@ -1683,7 +1683,8 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, g_ptr_array_add (map->backends, bk); if (!map->name) { - map->name = g_strdup (ucl_object_tostring (elt)); + map->name = rspamd_mempool_strdup (cfg->cfg_pool, + ucl_object_tostring (elt)); } } } diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c index 0b271affe..c74bcf31b 100644 --- a/src/lua/lua_map.c +++ b/src/lua/lua_map.c @@ -381,6 +381,9 @@ lua_config_add_map (lua_State *L) &map_obj, &description, &cbidx, &type)) { ret = luaL_error (L, "invalid table arguments: %s", err->message); g_error_free (err); + if (map_obj) { + ucl_object_unref (map_obj); + } return ret; } @@ -410,6 +413,10 @@ lua_config_add_map (lua_State *L) luaL_unref (L, LUA_REGISTRYINDEX, cbidx); } + if (map_obj) { + ucl_object_unref (map_obj); + } + lua_pushnil (L); return 1; diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c index 1088fe639..040219e2a 100644 --- a/src/plugins/fuzzy_check.c +++ b/src/plugins/fuzzy_check.c @@ -237,7 +237,7 @@ parse_mime_types (const gchar *str) gchar **strvec, *p; gint num, i; struct fuzzy_mime_type *type; - GPtrArray *res = g_ptr_array_new (); + GPtrArray *res; strvec = g_strsplit_set (str, ",", 0); num = g_strv_length (strvec); diff --git a/src/rspamd.c b/src/rspamd.c index 19811238c..6a9c4f321 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -642,7 +642,7 @@ spawn_workers (struct rspamd_main *rspamd_main, struct event_base *ev_base) } } - g_ptr_array_free (seen_mandatory_workers); + g_ptr_array_free (seen_mandatory_workers, TRUE); } static void @@ -1417,6 +1417,7 @@ main (gint argc, gchar **argv, gchar **env) REF_RELEASE (rspamd_main->cfg); g_hash_table_unref (rspamd_main->spairs); rspamd_mempool_delete (rspamd_main->server_pool); + rspamd_pidfile_close (rspamd_main->pfh); g_free (rspamd_main); event_base_free (ev_base); |