Преглед изворни кода

[Fix] More leaks...

tags/1.5.0
Vsevolod Stakhov пре 7 година
родитељ
комит
9886b3d1a4
8 измењених фајлова са 64 додато и 34 уклоњено
  1. 21
    10
      src/libserver/cfg_rcl.c
  2. 2
    3
      src/libserver/cfg_utils.c
  3. 13
    9
      src/libutil/map.c
  4. 5
    3
      src/libutil/upstream.c
  5. 3
    8
      src/lua/lua_map.c
  6. 5
    1
      src/lua/lua_regexp.c
  7. 11
    0
      src/plugins/fuzzy_check.c
  8. 4
    0
      src/rspamd.c

+ 21
- 10
src/libserver/cfg_rcl.c Прегледај датотеку



struct rspamd_rcl_default_handler_data { struct rspamd_rcl_default_handler_data {
struct rspamd_rcl_struct_parser pd; struct rspamd_rcl_struct_parser pd;
const gchar *key;
gchar *key;
rspamd_rcl_default_handler_t handler; rspamd_rcl_default_handler_t handler;
UT_hash_handle hh; UT_hash_handle hh;
}; };


if (rspamd_rcl_section_parse_defaults (cfg, section, pool, obj, st, err)) { if (rspamd_rcl_section_parse_defaults (cfg, section, pool, obj, st, err)) {
ccf->statfiles = g_list_prepend (ccf->statfiles, st); ccf->statfiles = g_list_prepend (ccf->statfiles, st);

if (st->label != NULL) { if (st->label != NULL) {
labels = g_hash_table_lookup (ccf->labels, st->label); labels = g_hash_table_lookup (ccf->labels, st->label);
if (labels != NULL) { if (labels != NULL) {
gint flags, gint flags,
const gchar *doc_string) 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) { if (section->doc_ref != NULL) {
rspamd_rcl_add_doc_obj (section->doc_ref, rspamd_rcl_add_doc_obj (section->doc_ref,
0); 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 * struct rspamd_rcl_section *
return FALSE; return FALSE;
} }


rspamd_mempool_add_destructor (pool,
(rspamd_mempool_destruct_t)rspamd_pubkey_unref, pk);

return TRUE; return TRUE;
} }


rspamd_rcl_section_free (gpointer p) rspamd_rcl_section_free (gpointer p)
{ {
struct rspamd_rcl_section *top = p, *cur, *tmp; struct rspamd_rcl_section *top = p, *cur, *tmp;
struct rspamd_rcl_default_handler_data *dh, *dhtmp;


HASH_ITER (hh, top, cur, tmp) { HASH_ITER (hh, top, cur, tmp) {
HASH_DEL (top, cur); HASH_DEL (top, cur);
rspamd_rcl_section_free (cur->subsections); 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); ucl_object_unref (cur->doc_ref);
g_slice_free1 (sizeof (*cur), cur); g_slice_free1 (sizeof (*cur), cur);
} }

+ 2
- 3
src/libserver/cfg_utils.c Прегледај датотеку

cfg->max_diff = 20480; cfg->max_diff = 20480;


cfg->metrics = g_hash_table_new (rspamd_str_hash, rspamd_str_equal); 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 = cfg->composite_symbols =
g_hash_table_new (rspamd_str_hash, rspamd_str_equal); g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
cfg->classifiers_symbols = g_hash_table_new (rspamd_str_hash, cfg->classifiers_symbols = g_hash_table_new (rspamd_str_hash,


g_list_free (cfg->classifiers); g_list_free (cfg->classifiers);
g_list_free (cfg->metrics_list); g_list_free (cfg->metrics_list);
g_list_free (cfg->workers);
rspamd_symbols_cache_destroy (cfg->cache); rspamd_symbols_cache_destroy (cfg->cache);
#ifdef WITH_HIREDIS #ifdef WITH_HIREDIS
if (cfg->redis_pool) { if (cfg->redis_pool) {

+ 13
- 9
src/libutil/map.c Прегледај датотеку

} }
} }


if (bk->trusted_pubkey) {
rspamd_pubkey_unref (bk->trusted_pubkey);
}

g_slice_free1 (sizeof (*bk), bk); g_slice_free1 (sizeof (*bk), bk);
} }


return NULL; 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->read_callback = read_callback;
map->fin_callback = fin_callback; map->fin_callback = fin_callback;
map->user_data = user_data; map->user_data = user_data;
map->cache = map->cache =
rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache)); rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache));
map->backends = g_ptr_array_sized_new (1); 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); 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; map->poll_timeout = cfg->map_timeout;


if (description != NULL) { if (description != NULL) {
map->description = g_strdup (description);
map->description = rspamd_mempool_strdup (cfg->cfg_pool, description);
} }


rspamd_map_calculate_hash (map); rspamd_map_calculate_hash (map);
read_callback, fin_callback, user_data); 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->read_callback = read_callback;
map->fin_callback = fin_callback; map->fin_callback = fin_callback;
map->user_data = user_data; map->user_data = user_data;
map->cache = map->cache =
rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache)); rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (*map->cache));
map->backends = g_ptr_array_new (); 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; map->poll_timeout = cfg->map_timeout;


if (description) { if (description) {
map->description = g_strdup (description);
map->description = rspamd_mempool_strdup (cfg->cfg_pool, description);
} }


if (ucl_object_type (obj) == UCL_ARRAY) { if (ucl_object_type (obj) == UCL_ARRAY) {
return map; return map;


err: err:
g_ptr_array_free (map->backends, TRUE);
g_free (map->name);
g_free (map->description);
g_slice_free1 (sizeof (*map), map);


return NULL; return NULL;
} }

+ 5
- 3
src/libutil/upstream.c Прегледај датотеку



while (p < end) { while (p < end) {
len = strcspn (p, separators); len = strcspn (p, separators);

if (len > 0) { if (len > 0) {
tmp = g_malloc (len + 1); tmp = g_malloc (len + 1);
rspamd_strlcpy (tmp, p, len + 1); rspamd_strlcpy (tmp, p, len + 1);

if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) { if (rspamd_upstreams_add_upstream (ups, tmp, def_port, data)) {
ret = TRUE; ret = TRUE;
} }
else {
g_free (tmp);
}

g_free (tmp);
} }

p += len; p += len;
/* Skip separators */ /* Skip separators */
p += strspn (p, separators); p += strspn (p, separators);

+ 3
- 8
src/lua/lua_map.c Прегледај датотеку

} }
else if (strcmp (type, "set") == 0) { else if (strcmp (type, "set") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map)); 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; map->type = RSPAMD_LUA_MAP_SET;


if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description, if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_hosts_read, rspamd_hosts_read,
rspamd_hosts_fin, rspamd_hosts_fin,
(void **)&map->data.hash)) == NULL) { (void **)&map->data.hash)) == NULL) {
g_hash_table_destroy (map->data.hash);
lua_pushnil (L); lua_pushnil (L);
ucl_object_unref (map_obj); ucl_object_unref (map_obj);


} }
else if (strcmp (type, "map") == 0 || strcmp (type, "hash") == 0) { else if (strcmp (type, "map") == 0 || strcmp (type, "hash") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map)); 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; map->type = RSPAMD_LUA_MAP_HASH;


if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description, if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_kv_list_read, rspamd_kv_list_read,
rspamd_kv_list_fin, rspamd_kv_list_fin,
(void **)&map->data.hash)) == NULL) { (void **)&map->data.hash)) == NULL) {
g_hash_table_destroy (map->data.hash);
lua_pushnil (L); lua_pushnil (L);
ucl_object_unref (map_obj); ucl_object_unref (map_obj);


} }
else if (strcmp (type, "radix") == 0) { else if (strcmp (type, "radix") == 0) {
map = rspamd_mempool_alloc0 (cfg->cfg_pool, sizeof (*map)); 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; map->type = RSPAMD_LUA_MAP_RADIX;


if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description, if ((m = rspamd_map_add_from_ucl (cfg, map_obj, description,
rspamd_radix_read, rspamd_radix_read,
rspamd_radix_fin, rspamd_radix_fin,
(void **)&map->data.radix)) == NULL) { (void **)&map->data.radix)) == NULL) {
radix_destroy_compressed (map->data.radix);
lua_pushnil (L); lua_pushnil (L);
ucl_object_unref (map_obj); ucl_object_unref (map_obj);



+ 5
- 1
src/lua/lua_regexp.c Прегледај датотеку

luaL_register (L, NULL, regexplib_m); luaL_register (L, NULL, regexplib_m);
rspamd_lua_add_preload (L, "rspamd_regexp", lua_load_regexp); 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); lua_settop (L, 0);
} }

+ 11
- 0
src/plugins/fuzzy_check.c Прегледај датотеку

strvec = g_strsplit_set (str, ",", 0); strvec = g_strsplit_set (str, ",", 0);
num = g_strv_length (strvec); num = g_strv_length (strvec);
res = g_ptr_array_sized_new (num); 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++) { for (i = 0; i < num; i++) {
g_strstrip (strvec[i]); g_strstrip (strvec[i]);
type->type_re = rspamd_regexp_from_glob (strvec[i], p - strvec[i], type->type_re = rspamd_regexp_from_glob (strvec[i], p - strvec[i],
NULL); NULL);
type->subtype_re = rspamd_regexp_from_glob (p + 1, 0, 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); g_ptr_array_add (res, type);
} }
else { else {
type = rspamd_mempool_alloc (fuzzy_module_ctx->fuzzy_pool, type = rspamd_mempool_alloc (fuzzy_module_ctx->fuzzy_pool,
sizeof (struct fuzzy_mime_type)); sizeof (struct fuzzy_mime_type));
type->type_re = rspamd_regexp_from_glob (strvec[i], 0, NULL); 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; type->subtype_re = NULL;
g_ptr_array_add (res, type); g_ptr_array_add (res, type);
} }

+ 4
- 0
src/rspamd.c Прегледај датотеку

gchar *cfg_file; gchar *cfg_file;


tmp_cfg = rspamd_config_new (); 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->c_modules = g_hash_table_ref (rspamd_main->cfg->c_modules);
tmp_cfg->libs_ctx = rspamd_main->cfg->libs_ctx; tmp_cfg->libs_ctx = rspamd_main->cfg->libs_ctx;
REF_RETAIN (tmp_cfg->libs_ctx); REF_RETAIN (tmp_cfg->libs_ctx);
} }
} }
} }

g_ptr_array_free (seen_mandatory_workers);
} }


static void static void
close (cur->control_pipe[0]); close (cur->control_pipe[0]);
close (cur->srv_pipe[0]); close (cur->srv_pipe[0]);
REF_RELEASE (cur->cf); REF_RELEASE (cur->cf);
g_ptr_array_free (cur->finish_actions, TRUE);
g_free (cur); g_free (cur);
} }
else { else {

Loading…
Откажи
Сачувај