summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-18 16:09:50 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-01-18 16:09:50 +0000
commit9886b3d1a4e1d823a29b8f420766f2dc82c5a2fc (patch)
tree57f2f182ec35376d7a72b505dbc33d6171d4f4dc
parent99e51722286671c56cf4c25b67b6168ed5f7bfb5 (diff)
downloadrspamd-9886b3d1a4e1d823a29b8f420766f2dc82c5a2fc.tar.gz
rspamd-9886b3d1a4e1d823a29b8f420766f2dc82c5a2fc.zip
[Fix] More leaks...
-rw-r--r--src/libserver/cfg_rcl.c31
-rw-r--r--src/libserver/cfg_utils.c5
-rw-r--r--src/libutil/map.c22
-rw-r--r--src/libutil/upstream.c8
-rw-r--r--src/lua/lua_map.c11
-rw-r--r--src/lua/lua_regexp.c6
-rw-r--r--src/plugins/fuzzy_check.c11
-rw-r--r--src/rspamd.c4
8 files changed, 64 insertions, 34 deletions
diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c
index e80eae7dd..48ecb94da 100644
--- a/src/libserver/cfg_rcl.c
+++ b/src/libserver/cfg_rcl.c
@@ -39,7 +39,7 @@
struct rspamd_rcl_default_handler_data {
struct rspamd_rcl_struct_parser pd;
- const gchar *key;
+ gchar *key;
rspamd_rcl_default_handler_t handler;
UT_hash_handle hh;
};
@@ -1185,6 +1185,7 @@ rspamd_rcl_statfile_handler (rspamd_mempool_t *pool, const ucl_object_t *obj,
if (rspamd_rcl_section_parse_defaults (cfg, section, pool, obj, st, err)) {
ccf->statfiles = g_list_prepend (ccf->statfiles, st);
+
if (st->label != NULL) {
labels = g_hash_table_lookup (ccf->labels, st->label);
if (labels != NULL) {
@@ -1698,13 +1699,13 @@ rspamd_rcl_add_default_handler (struct rspamd_rcl_section *section,
gint flags,
const gchar *doc_string)
{
- struct rspamd_rcl_default_handler_data *new;
+ struct rspamd_rcl_default_handler_data *nhandler;
- new = g_slice_alloc0 (sizeof (struct rspamd_rcl_default_handler_data));
- new->key = name;
- new->handler = handler;
- new->pd.offset = offset;
- new->pd.flags = flags;
+ nhandler = g_slice_alloc0 (sizeof (struct rspamd_rcl_default_handler_data));
+ nhandler->key = g_strdup (name);
+ nhandler->handler = handler;
+ nhandler->pd.offset = offset;
+ nhandler->pd.flags = flags;
if (section->doc_ref != NULL) {
rspamd_rcl_add_doc_obj (section->doc_ref,
@@ -1717,9 +1718,9 @@ rspamd_rcl_add_default_handler (struct rspamd_rcl_section *section,
0);
}
- HASH_ADD_KEYPTR (hh, section->default_parser, new->key, strlen (
- new->key), new);
- return new;
+ HASH_ADD_KEYPTR (hh, section->default_parser, nhandler->key, strlen (
+ nhandler->key), nhandler);
+ return nhandler;
}
struct rspamd_rcl_section *
@@ -3019,6 +3020,9 @@ rspamd_rcl_parse_struct_pubkey (rspamd_mempool_t *pool,
return FALSE;
}
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t)rspamd_pubkey_unref, pk);
+
return TRUE;
}
@@ -3462,6 +3466,7 @@ static void
rspamd_rcl_section_free (gpointer p)
{
struct rspamd_rcl_section *top = p, *cur, *tmp;
+ struct rspamd_rcl_default_handler_data *dh, *dhtmp;
HASH_ITER (hh, top, cur, tmp) {
HASH_DEL (top, cur);
@@ -3470,6 +3475,12 @@ rspamd_rcl_section_free (gpointer p)
rspamd_rcl_section_free (cur->subsections);
}
+ HASH_ITER (hh, cur->default_parser, dh, dhtmp) {
+ HASH_DEL (cur->default_parser, dh);
+ g_free (dh->key);
+ g_slice_free1 (sizeof (*dh), dh);
+ }
+
ucl_object_unref (cur->doc_ref);
g_slice_free1 (sizeof (*cur), cur);
}
diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c
index 8a8138ebf..12a13cd9b 100644
--- a/src/libserver/cfg_utils.c
+++ b/src/libserver/cfg_utils.c
@@ -120,9 +120,7 @@ rspamd_config_new (void)
cfg->max_diff = 20480;
cfg->metrics = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
- if (cfg->c_modules == NULL) {
- cfg->c_modules = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
- }
+ cfg->c_modules = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
cfg->composite_symbols =
g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
cfg->classifiers_symbols = g_hash_table_new (rspamd_str_hash,
@@ -209,6 +207,7 @@ rspamd_config_free (struct rspamd_config *cfg)
g_list_free (cfg->classifiers);
g_list_free (cfg->metrics_list);
+ g_list_free (cfg->workers);
rspamd_symbols_cache_destroy (cfg->cache);
#ifdef WITH_HIREDIS
if (cfg->redis_pool) {
diff --git a/src/libutil/map.c b/src/libutil/map.c
index 6a1e76fcd..af76c6979 100644
--- a/src/libutil/map.c
+++ b/src/libutil/map.c
@@ -1375,6 +1375,10 @@ rspamd_map_backend_dtor (struct rspamd_map_backend *bk)
}
}
+ if (bk->trusted_pubkey) {
+ rspamd_pubkey_unref (bk->trusted_pubkey);
+ }
+
g_slice_free1 (sizeof (*bk), bk);
}
@@ -1520,7 +1524,7 @@ rspamd_map_add (struct rspamd_config *cfg,
return NULL;
}
- map = g_slice_alloc0 (sizeof (struct rspamd_map));
+ map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (struct rspamd_map));
map->read_callback = read_callback;
map->fin_callback = fin_callback;
map->user_data = user_data;
@@ -1531,12 +1535,14 @@ rspamd_map_add (struct rspamd_config *cfg,
map->cache =
rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache));
map->backends = g_ptr_array_sized_new (1);
+ rspamd_mempool_add_destructor (cfg->cfg_pool, rspamd_ptr_array_free_hard,
+ map->backends);
g_ptr_array_add (map->backends, bk);
- map->name = g_strdup (map_line);
+ map->name = rspamd_mempool_strdup (cfg->cfg_pool, map_line);
map->poll_timeout = cfg->map_timeout;
if (description != NULL) {
- map->description = g_strdup (description);
+ map->description = rspamd_mempool_strdup (cfg->cfg_pool, description);
}
rspamd_map_calculate_hash (map);
@@ -1568,7 +1574,7 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg,
read_callback, fin_callback, user_data);
}
- map = g_slice_alloc0 (sizeof (struct rspamd_map));
+ map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (struct rspamd_map));
map->read_callback = read_callback;
map->fin_callback = fin_callback;
map->user_data = user_data;
@@ -1579,10 +1585,12 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg,
map->cache =
rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache));
map->backends = g_ptr_array_new ();
+ rspamd_mempool_add_destructor (cfg->cfg_pool, rspamd_ptr_array_free_hard,
+ map->backends);
map->poll_timeout = cfg->map_timeout;
if (description) {
- map->description = g_strdup (description);
+ map->description = rspamd_mempool_strdup (cfg->cfg_pool, description);
}
if (ucl_object_type (obj) == UCL_ARRAY) {
@@ -1699,10 +1707,6 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg,
return map;
err:
- g_ptr_array_free (map->backends, TRUE);
- g_free (map->name);
- g_free (map->description);
- g_slice_free1 (sizeof (*map), map);
return NULL;
}
diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c
index 0576525d9..4e437d416 100644
--- a/src/libutil/upstream.c
+++ b/src/libutil/upstream.c
@@ -654,16 +654,18 @@ rspamd_upstreams_parse_line (struct upstream_list *ups,
while (p < end) {
len = strcspn (p, separators);
+
if (len > 0) {
tmp = g_malloc (len + 1);
rspamd_strlcpy (tmp, p, len + 1);
+
if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) {
ret = TRUE;
}
- else {
- g_free (tmp);
- }
+
+ g_free (tmp);
}
+
p += len;
/* Skip separators */
p += strspn (p, separators);
diff --git a/src/lua/lua_map.c b/src/lua/lua_map.c
index 581c4b85b..0b271affe 100644
--- a/src/lua/lua_map.c
+++ b/src/lua/lua_map.c
@@ -417,15 +417,13 @@ lua_config_add_map (lua_State *L)
}
else if (strcmp (type, "set") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map));
- map->data.hash = g_hash_table_new (rspamd_strcase_hash,
- rspamd_strcase_equal);
+ map->data.hash = NULL;
map->type = RSPAMD_LUA_MAP_SET;
if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_hosts_read,
rspamd_hosts_fin,
(void **)&map->data.hash)) == NULL) {
- g_hash_table_destroy (map->data.hash);
lua_pushnil (L);
ucl_object_unref (map_obj);
@@ -434,15 +432,13 @@ lua_config_add_map (lua_State *L)
}
else if (strcmp (type, "map") == 0 || strcmp (type, "hash") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map));
- map->data.hash = g_hash_table_new (rspamd_strcase_hash,
- rspamd_strcase_equal);
+ map->data.hash = NULL;
map->type = RSPAMD_LUA_MAP_HASH;
if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_kv_list_read,
rspamd_kv_list_fin,
(void **)&map->data.hash)) == NULL) {
- g_hash_table_destroy (map->data.hash);
lua_pushnil (L);
ucl_object_unref (map_obj);
@@ -451,14 +447,13 @@ lua_config_add_map (lua_State *L)
}
else if (strcmp (type, "radix") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map));
- map->data.radix = radix_create_compressed ();
+ map->data.radix = NULL;
map->type = RSPAMD_LUA_MAP_RADIX;
if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_radix_read,
rspamd_radix_fin,
(void **)&map->data.radix)) == NULL) {
- radix_destroy_compressed (map->data.radix);
lua_pushnil (L);
ucl_object_unref (map_obj);
diff --git a/src/lua/lua_regexp.c b/src/lua/lua_regexp.c
index 1e6122b2e..1640f8023 100644
--- a/src/lua/lua_regexp.c
+++ b/src/lua/lua_regexp.c
@@ -745,6 +745,10 @@ luaopen_regexp (lua_State * L)
luaL_register (L, NULL, regexplib_m);
rspamd_lua_add_preload (L, "rspamd_regexp", lua_load_regexp);
- regexp_static_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+ if (regexp_static_pool == NULL) {
+ regexp_static_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
+ "regexp_lua_pool");
+ }
+
lua_settop (L, 0);
}
diff --git a/src/plugins/fuzzy_check.c b/src/plugins/fuzzy_check.c
index e6a7b1bc1..1088fe639 100644
--- a/src/plugins/fuzzy_check.c
+++ b/src/plugins/fuzzy_check.c
@@ -242,6 +242,8 @@ parse_mime_types (const gchar *str)
strvec = g_strsplit_set (str, ",", 0);
num = g_strv_length (strvec);
res = g_ptr_array_sized_new (num);
+ rspamd_mempool_add_destructor (fuzzy_module_ctx->fuzzy_pool,
+ rspamd_ptr_array_free_hard, res);
for (i = 0; i < num; i++) {
g_strstrip (strvec[i]);
@@ -252,12 +254,21 @@ parse_mime_types (const gchar *str)
type->type_re = rspamd_regexp_from_glob (strvec[i], p - strvec[i],
NULL);
type->subtype_re = rspamd_regexp_from_glob (p + 1, 0, NULL);
+ rspamd_mempool_add_destructor (fuzzy_module_ctx->fuzzy_pool,
+ (rspamd_mempool_destruct_t)rspamd_regexp_unref,
+ type->type_re);
+ rspamd_mempool_add_destructor (fuzzy_module_ctx->fuzzy_pool,
+ (rspamd_mempool_destruct_t)rspamd_regexp_unref,
+ type->subtype_re);
g_ptr_array_add (res, type);
}
else {
type = rspamd_mempool_alloc (fuzzy_module_ctx->fuzzy_pool,
sizeof (struct fuzzy_mime_type));
type->type_re = rspamd_regexp_from_glob (strvec[i], 0, NULL);
+ rspamd_mempool_add_destructor (fuzzy_module_ctx->fuzzy_pool,
+ (rspamd_mempool_destruct_t)rspamd_regexp_unref,
+ type->type_re);
type->subtype_re = NULL;
g_ptr_array_add (res, type);
}
diff --git a/src/rspamd.c b/src/rspamd.c
index f13ec9454..19811238c 100644
--- a/src/rspamd.c
+++ b/src/rspamd.c
@@ -272,6 +272,7 @@ reread_config (struct rspamd_main *rspamd_main)
gchar *cfg_file;
tmp_cfg = rspamd_config_new ();
+ g_hash_table_unref (tmp_cfg->c_modules);
tmp_cfg->c_modules = g_hash_table_ref (rspamd_main->cfg->c_modules);
tmp_cfg->libs_ctx = rspamd_main->cfg->libs_ctx;
REF_RETAIN (tmp_cfg->libs_ctx);
@@ -640,6 +641,8 @@ spawn_workers (struct rspamd_main *rspamd_main, struct event_base *ev_base)
}
}
}
+
+ g_ptr_array_free (seen_mandatory_workers);
}
static void
@@ -997,6 +1000,7 @@ rspamd_cld_handler (gint signo, short what, gpointer arg)
close (cur->control_pipe[0]);
close (cur->srv_pipe[0]);
REF_RELEASE (cur->cf);
+ g_ptr_array_free (cur->finish_actions, TRUE);
g_free (cur);
}
else {