]> source.dussan.org Git - rspamd.git/commitdiff
Fix issues in spf plugin.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 18 Mar 2015 19:55:04 +0000 (19:55 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 18 Mar 2015 19:55:04 +0000 (19:55 +0000)
src/libserver/spf.c
src/plugins/spf.c

index 81f87dda696e0d58e46fc5ab5ab55238a737b785..72e364e4e7ba8c72872a52b47eb4f922e01a01f9 100644 (file)
@@ -113,7 +113,6 @@ struct spf_dns_cb {
                }                                                       \
        } while (0)                                                 \
 
-static gboolean parse_spf_record (struct spf_record *rec, const gchar *elt);
 static gboolean start_spf_parse (struct spf_record *rec, gchar *begin);
 
 /* Determine spf mech */
@@ -1017,7 +1016,7 @@ parse_spf_redirect (struct spf_record *rec, struct spf_addr *addr)
 
        CHECK_REC (rec);
 
-       domain = strchr (addr->spf_string, ':');
+       domain = strchr (addr->spf_string, '=');
 
        if (domain == NULL) {
                return FALSE;
@@ -1394,18 +1393,15 @@ expand_spf_macro (struct spf_record *rec,
 
 /* Read current element and try to parse record */
 static gboolean
-parse_spf_record (struct spf_record *rec, const gchar *elt)
+parse_spf_record (struct spf_record *rec, struct spf_resolved_element *resolved,
+               const gchar *elt)
 {
        struct spf_addr *addr = NULL;
        gboolean res = FALSE;
        const gchar *begin;
        struct rspamd_task *task;
-       struct spf_resolved_element *resolved;
        gchar t;
 
-       resolved = &g_array_index (rec->resolved, struct spf_resolved_element,
-               rec->resolved->len - 1);
-
        g_assert (elt != NULL);
        g_assert (rec != NULL);
 
@@ -1519,7 +1515,7 @@ parse_spf_record (struct spf_record *rec, const gchar *elt)
        }
 
        if (res) {
-               addr->flags |= RSPAMD_SPF_FLAG_VALID;
+               addr->flags |= RSPAMD_SPF_FLAG_PARSED;
        }
 
        return res;
@@ -1553,6 +1549,7 @@ static gboolean
 start_spf_parse (struct spf_record *rec, gchar *begin)
 {
        gchar **elts, **cur_elt;
+       struct spf_resolved_element *resolved;
 
        /* Skip spaces */
        while (g_ascii_isspace (*begin)) {
@@ -1593,13 +1590,15 @@ start_spf_parse (struct spf_record *rec, gchar *begin)
                begin++;
        }
 
+       resolved = &g_array_index (rec->resolved, struct spf_resolved_element,
+                       rec->resolved->len - 1);
        elts = g_strsplit_set (begin, " ", 0);
 
        if (elts) {
                cur_elt = elts;
 
                while (*cur_elt) {
-                       parse_spf_record (rec, *cur_elt);
+                       parse_spf_record (rec, resolved, *cur_elt);
                        cur_elt ++;
                }
 
@@ -1665,6 +1664,9 @@ resolve_spf (struct rspamd_task *task, spf_cb_t callback)
        rec->task = task;
        rec->callback = callback;
 
+       rec->resolved = g_array_sized_new (FALSE, FALSE,
+                       sizeof (struct spf_resolved_element), 8);
+
        rspamd_spf_new_addr_list (rec, rec->sender_domain);
 
        /* Add destructor */
index 60e9179d5fff37631b2f438ec9cea9c4dfa49f77..caeb9365b9a948106601bdf0c48769a1de878764 100644 (file)
@@ -299,9 +299,11 @@ spf_plugin_callback (struct spf_resolved *record, struct rspamd_task *task)
                        rspamd_lru_hash_lookup (spf_module_ctx->spf_hash,
                        record->domain, task->tv.tv_sec)) == NULL) {
 
+                       l = spf_record_ref (record);
                        rspamd_lru_hash_insert (spf_module_ctx->spf_hash,
-                               record->domain, spf_record_ref (record),
+                               record->domain, l,
                                task->tv.tv_sec, record->ttl);
+
                }
                spf_record_ref (l);
                spf_check_list (l, task);