From 91bc2242c8263066348c28a428376cf20109433c Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 21 Oct 2017 15:52:50 +0100 Subject: [PATCH] [Fix] Fix multiple headers in DKIM headers list MFH: rspamd-1.6 Issue: #1876 --- src/libserver/dkim.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/libserver/dkim.c b/src/libserver/dkim.c index 2a2e7a7a7..b0bab01d9 100644 --- a/src/libserver/dkim.c +++ b/src/libserver/dkim.c @@ -421,6 +421,7 @@ rspamd_dkim_parse_hdrlist_common (struct rspamd_dkim_common_ctx *ctx, gboolean from_found = FALSE; guint count = 0; struct rspamd_dkim_header *new; + gpointer found; GHashTable *htb; p = param; @@ -444,30 +445,37 @@ rspamd_dkim_parse_hdrlist_common (struct rspamd_dkim_common_ctx *ctx, while (p <= end) { if ((p == end || *p == ':') && p - c > 0) { + h = rspamd_mempool_alloc (ctx->pool, p - c + 1); rspamd_strlcpy (h, c, p - c + 1); - g_strstrip (h); - new = rspamd_mempool_alloc (ctx->pool, - sizeof (struct rspamd_dkim_header)); - new->name = h; - new->count = 0; + g_strstrip (h); /* Check mandatory from */ if (!from_found && g_ascii_strcasecmp (h, "from") == 0) { from_found = TRUE; } + new = rspamd_mempool_alloc (ctx->pool, + sizeof (struct rspamd_dkim_header)); + new->name = h; + new->count = 0; + g_ptr_array_add (ctx->hlist, new); - if (g_hash_table_lookup (htb, h) != NULL) { - new->count++; + if ((found = g_hash_table_lookup (htb, h)) != NULL) { + count = GPOINTER_TO_UINT (found); + new->count = count; + count ++; + g_hash_table_insert (htb, h, GUINT_TO_POINTER (count)); } else { - /* Insert new header to the list */ - g_hash_table_insert (htb, (gpointer)new->name, new); + /* Insert new header order to the list */ + count = new->count + 1; } + g_hash_table_insert (htb, h, GUINT_TO_POINTER (count)); + c = p + 1; p++; } -- 2.39.5