]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix multiple headers in DKIM headers list
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 21 Oct 2017 14:52:50 +0000 (15:52 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 21 Oct 2017 14:52:50 +0000 (15:52 +0100)
MFH: rspamd-1.6
Issue: #1876

src/libserver/dkim.c

index 2a2e7a7a7663fa211b0d7c0fafec1f74e928aeb8..b0bab01d98dec3a9f7d340fad67d91ee51b71df8 100644 (file)
@@ -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++;
                }