diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-10-21 15:52:50 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-10-21 15:52:50 +0100 |
commit | 91bc2242c8263066348c28a428376cf20109433c (patch) | |
tree | dd8915a1c94b160423e9031fa41f92dc1b3fd965 /src | |
parent | ca6e467891c326d8fd32e021bdd4de6f21adcb4d (diff) | |
download | rspamd-91bc2242c8263066348c28a428376cf20109433c.tar.gz rspamd-91bc2242c8263066348c28a428376cf20109433c.zip |
[Fix] Fix multiple headers in DKIM headers list
MFH: rspamd-1.6
Issue: #1876
Diffstat (limited to 'src')
-rw-r--r-- | src/libserver/dkim.c | 26 |
1 files 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++; } |