diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-14 11:47:36 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-06-14 15:15:19 +0100 |
commit | 7406e60b74327df055f3bacfc478bd5cb68fd6c9 (patch) | |
tree | 9589f52da4b7e19f2eb0997674503763107619af /src/libserver | |
parent | 700949bd941aeec41060163e36509061791c502f (diff) | |
download | rspamd-7406e60b74327df055f3bacfc478bd5cb68fd6c9.tar.gz rspamd-7406e60b74327df055f3bacfc478bd5cb68fd6c9.zip |
[Fix] Cleanup maps data on shutdown
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/cfg_utils.c | 27 | ||||
-rw-r--r-- | src/libserver/dynamic_cfg.c | 25 | ||||
-rw-r--r-- | src/libserver/worker_util.c | 11 |
3 files changed, 48 insertions, 15 deletions
diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index e58232a00..ef5d89ff6 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -56,6 +56,7 @@ static gchar * rspamd_ucl_read_cb (gchar * chunk, struct map_cb_data *data, gboolean final); static void rspamd_ucl_fin_cb (struct map_cb_data *data); +static void rspamd_ucl_dtor_cb (struct map_cb_data *data); guint rspamd_config_log_id = (guint)-1; RSPAMD_CONSTRUCTOR(rspamd_config_log_init) @@ -1083,7 +1084,8 @@ rspamd_include_map_handler (const guchar *data, gsize len, "ucl include", rspamd_ucl_read_cb, rspamd_ucl_fin_cb, - (void **)pcbdata); + rspamd_ucl_dtor_cb, + (void **)pcbdata) != NULL; } /* @@ -1364,6 +1366,19 @@ rspamd_ucl_fin_cb (struct map_cb_data *data) } } +static void +rspamd_ucl_dtor_cb (struct map_cb_data *data) +{ + struct rspamd_ucl_map_cbdata *cbdata = data->cur_data; + + if (cbdata != NULL) { + if (cbdata->buf != NULL) { + g_string_free (cbdata->buf, TRUE); + } + g_free (cbdata); + } +} + gboolean rspamd_check_module (struct rspamd_config *cfg, module_t *mod) { @@ -1888,7 +1903,10 @@ rspamd_config_radix_from_ucl (struct rspamd_config *cfg, if (rspamd_map_is_map (str)) { if (rspamd_map_add_from_ucl (cfg, cur_elt, - description, rspamd_radix_read, rspamd_radix_fin, + description, + rspamd_radix_read, + rspamd_radix_fin, + rspamd_radix_dtor, (void **)target) == NULL) { g_set_error (err, g_quark_from_static_string ("rspamd-config"), EINVAL, "bad map definition %s for %s", str, @@ -1908,7 +1926,10 @@ rspamd_config_radix_from_ucl (struct rspamd_config *cfg, case UCL_OBJECT: /* Should be a map description */ if (rspamd_map_add_from_ucl (cfg, cur_elt, - description, rspamd_radix_read, rspamd_radix_fin, + description, + rspamd_radix_read, + rspamd_radix_fin, + rspamd_radix_dtor, (void **)target) == NULL) { g_set_error (err, g_quark_from_static_string ("rspamd-config"), EINVAL, "bad map object for %s", ucl_object_key (obj)); diff --git a/src/libserver/dynamic_cfg.c b/src/libserver/dynamic_cfg.c index 584590ed9..17818888e 100644 --- a/src/libserver/dynamic_cfg.c +++ b/src/libserver/dynamic_cfg.c @@ -222,6 +222,22 @@ json_config_fin_cb (struct map_cb_data *data) jb->cfg->current_dynamic_conf = top; } +static void +json_config_dtor_cb (struct map_cb_data *data) +{ + struct config_json_buf *jb; + + if (data->cur_data) { + jb = data->cur_data; + /* Clean prev data */ + if (jb->buf) { + g_string_free (jb->buf, TRUE); + } + + g_free (jb); + } +} + /** * Init dynamic configuration using map logic and specific configuration * @param cfg config file @@ -244,8 +260,13 @@ init_dynamic_config (struct rspamd_config *cfg) *pjb = jb; cfg->current_dynamic_conf = ucl_object_typed_new (UCL_ARRAY); - if (!rspamd_map_add (cfg, cfg->dynamic_conf, "Dynamic configuration map", - json_config_read_cb, json_config_fin_cb, (void **)pjb)) { + if (!rspamd_map_add (cfg, + cfg->dynamic_conf, + "Dynamic configuration map", + json_config_read_cb, + json_config_fin_cb, + json_config_dtor_cb, + (void **)pjb)) { msg_err ("cannot add map for configuration %s", cfg->dynamic_conf); } } diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 8c4e934bc..c60273dea 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -342,7 +342,6 @@ rspamd_worker_stop_accept (struct rspamd_worker *worker) { GList *cur; struct event *events; - struct rspamd_map *map; /* Remove all events */ cur = worker->accept_events; @@ -383,15 +382,7 @@ rspamd_worker_stop_accept (struct rspamd_worker *worker) #endif /* Cleanup maps */ - for (cur = worker->srv->cfg->maps; cur != NULL; cur = g_list_next (cur)) { - map = cur->data; - - if (map->dtor) { - map->dtor (map->dtor_data); - } - - map->dtor = NULL; - } + rspamd_map_remove_all (worker->srv->cfg); } static rspamd_fstring_t * |