diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-05-04 17:58:17 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-05-04 17:58:17 +0100 |
commit | 48b8a405a13ef92007e16ec3aa84d2ae505d2717 (patch) | |
tree | 68bdb6a7c48339cc79cc6dddf648f47c7da4c1bd /src/libutil | |
parent | c616d17dfe0eb99709b04af26978c7d0837030d4 (diff) | |
download | rspamd-48b8a405a13ef92007e16ec3aa84d2ae505d2717.tar.gz rspamd-48b8a405a13ef92007e16ec3aa84d2ae505d2717.zip |
[Fix] Fix importing static maps from UCL
Issue: #2216
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/map.c | 73 |
1 files changed, 62 insertions, 11 deletions
diff --git a/src/libutil/map.c b/src/libutil/map.c index 698ccf3fd..1e8f70f7e 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -1977,6 +1977,35 @@ rspamd_map_calculate_hash (struct rspamd_map *map) g_free (cksum_encoded); } +static gboolean +rspamd_map_add_static_string (struct rspamd_config *cfg, + const ucl_object_t *elt, + GString *target) +{ + gsize sz; + const gchar *dline; + + if (ucl_object_type (elt) != UCL_STRING) { + msg_err_config ("map has static backend but `data` is " + "not string like: %s", + ucl_object_type_to_string (elt->type)); + return FALSE; + } + + /* Otherwise, we copy data to the backend */ + dline = ucl_object_tolstring (elt, &sz); + + if (sz == 0) { + msg_err_config ("map has static backend but empty no data"); + return FALSE; + } + + g_string_append_len (target, dline, sz); + g_string_append_c (target, '\n'); + + return TRUE; +} + struct rspamd_map * rspamd_map_add (struct rspamd_config *cfg, const gchar *map_line, @@ -2039,8 +2068,6 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, const ucl_object_t *cur, *elt; struct rspamd_map *map; struct rspamd_map_backend *bk; - gsize sz; - const gchar *dline; guint i; g_assert (obj != NULL); @@ -2183,25 +2210,49 @@ rspamd_map_add_from_ucl (struct rspamd_config *cfg, PTR_ARRAY_FOREACH (map->backends, i, bk) { if (bk->protocol == MAP_PROTO_STATIC) { + GString *map_data; /* We need data field in ucl */ elt = ucl_object_lookup (obj, "data"); - if (elt == NULL || ucl_object_type (elt) != UCL_STRING) { + if (elt == NULL) { msg_err_config ("map has static backend but no `data` field"); goto err; } - /* Otherwise, we copy data to the backend */ - dline = ucl_object_tolstring (elt, &sz); - if (sz == 0) { - msg_err_config ("map has static backend but empty `data` field"); - goto err; + if (ucl_object_type (elt) == UCL_STRING) { + map_data = g_string_sized_new (32); + + if (rspamd_map_add_static_string (cfg, elt, map_data)) { + bk->data.sd->data = map_data->str; + bk->data.sd->len = map_data->len; + g_string_free (map_data, FALSE); + } + else { + g_string_free (map_data, TRUE); + msg_err_config ("map has static backend with invalid `data` field"); + goto err; + } } + else if (ucl_object_type (elt) == UCL_ARRAY) { + map_data = g_string_sized_new (32); + it = ucl_object_iterate_new (elt); + + while ((cur = ucl_object_iterate_safe (it, true))) { + if (!rspamd_map_add_static_string (cfg, cur, map_data)) { + g_string_free (map_data, TRUE); + msg_err_config ("map has static backend with invalid " + "`data` field"); + ucl_object_iterate_free (it); + goto err; + } + } - bk->data.sd->data = g_malloc (sz); - bk->data.sd->len = sz; - memcpy (bk->data.sd->data, dline, sz); + ucl_object_iterate_free (it); + bk->data.sd->data = map_data->str; + bk->data.sd->len = map_data->len; + g_string_free (map_data, FALSE); + } } } } |