aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-10-21 15:52:50 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-10-21 15:52:50 +0100
commit91bc2242c8263066348c28a428376cf20109433c (patch)
treedd8915a1c94b160423e9031fa41f92dc1b3fd965 /src
parentca6e467891c326d8fd32e021bdd4de6f21adcb4d (diff)
downloadrspamd-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.c26
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++;
}