aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-14 11:47:36 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-06-14 15:15:19 +0100
commit7406e60b74327df055f3bacfc478bd5cb68fd6c9 (patch)
tree9589f52da4b7e19f2eb0997674503763107619af /src/libserver
parent700949bd941aeec41060163e36509061791c502f (diff)
downloadrspamd-7406e60b74327df055f3bacfc478bd5cb68fd6c9.tar.gz
rspamd-7406e60b74327df055f3bacfc478bd5cb68fd6c9.zip
[Fix] Cleanup maps data on shutdown
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/cfg_utils.c27
-rw-r--r--src/libserver/dynamic_cfg.c25
-rw-r--r--src/libserver/worker_util.c11
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 *