commit fe9d9d3: [Fix] Another try to fix add headers compatibility logic
Vsevolod Stakhov
vsevolod at rspamd.com
Tue Aug 23 22:56:03 UTC 2022
Author: Vsevolod Stakhov
Date: 2022-08-23 23:53:26 +0100
URL: https://github.com/rspamd/rspamd/commit/fe9d9d31896f74908c424ad4691a55d3f85e76c8 (HEAD -> master)
[Fix] Another try to fix add headers compatibility logic
Issue: #4246
---
src/libserver/milter.c | 55 +++++++++++++++++++++++++++++++++-----------------
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/src/libserver/milter.c b/src/libserver/milter.c
index a84506720..e559495fb 100644
--- a/src/libserver/milter.c
+++ b/src/libserver/milter.c
@@ -1747,7 +1747,7 @@ static gboolean
rspamd_milter_process_milter_block (struct rspamd_milter_session *session,
const ucl_object_t *obj, struct rspamd_action *action)
{
- const ucl_object_t *elt, *cur, *cur_elt;
+ const ucl_object_t *elt, *cur;
ucl_object_iter_t it;
struct rspamd_milter_private *priv = session->priv;
GString *hname, *hvalue;
@@ -1781,32 +1781,47 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session,
it = NULL;
while ((cur = ucl_object_iterate (elt, &it, true)) != NULL) {
- ucl_object_iter_t *elt_it;
- elt_it = ucl_object_iterate_new (cur);
const char *key_name = ucl_object_key (cur);
- while ((cur_elt = ucl_object_iterate_safe (elt_it, false)) != NULL) {
- if (ucl_object_type (cur_elt) == UCL_STRING) {
- hname = g_string_new (key_name);
- hvalue = g_string_new (ucl_object_tostring (cur_elt));
-
- rspamd_milter_send_action (session,
- RSPAMD_MILTER_ADDHEADER,
- hname, hvalue);
- g_string_free (hname, TRUE);
- g_string_free (hvalue, TRUE);
+ if (ucl_object_type (cur) == UCL_STRING) {
+ /*
+ * Legacy support of {"name": "value", ... } with
+ * multiple names under the same name
+ */
+ ucl_object_iter_t *elt_it;
+ const ucl_object_t *cur_elt;
+
+ elt_it = ucl_object_iterate_new (cur);
+ while ((cur_elt = ucl_object_iterate_safe (elt_it, false)) != NULL) {
+ if (ucl_object_type (cur_elt) == UCL_STRING) {
+ hname = g_string_new (key_name);
+ hvalue = g_string_new (ucl_object_tostring (cur_elt));
+
+ rspamd_milter_send_action (session,
+ RSPAMD_MILTER_ADDHEADER,
+ hname, hvalue);
+ g_string_free (hname, TRUE);
+ g_string_free (hvalue, TRUE);
+ }
+ else {
+ msg_warn_milter("legacy header with name %s, that has not a string value: %s",
+ key_name, ucl_object_type_to_string(cur_elt->type));
+ }
}
- else if (ucl_object_type (cur_elt) == UCL_OBJECT) {
+ ucl_object_iterate_free (elt_it);
+ }
+ else {
+ if (ucl_object_type (cur) == UCL_OBJECT) {
rspamd_milter_extract_single_header (session,
- key_name, cur_elt);
+ key_name, cur);
}
- else if (ucl_object_type (cur_elt) == UCL_ARRAY) {
+ else if (ucl_object_type (cur) == UCL_ARRAY) {
/* Multiple values for the same key */
ucl_object_iter_t *array_it;
const ucl_object_t *array_elt;
- array_it = ucl_object_iterate_new (cur_elt);
+ array_it = ucl_object_iterate_new (cur);
while ((array_elt = ucl_object_iterate_safe (array_it,
true)) != NULL) {
@@ -1816,9 +1831,11 @@ rspamd_milter_process_milter_block (struct rspamd_milter_session *session,
ucl_object_iterate_free (array_it);
}
+ else {
+ msg_warn_milter("non-legacy header with name %s, that has unsupported value type: %s",
+ key_name, ucl_object_type_to_string(cur->type));
+ }
}
-
- ucl_object_iterate_free (elt_it);
}
}
More information about the Commits
mailing list