]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Spf: Do not parse non TXT DNS replies as TXT replies
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Aug 2021 13:12:40 +0000 (14:12 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 23 Aug 2021 13:12:40 +0000 (14:12 +0100)
src/libserver/spf.c

index 999423c7da0145f278a1ebdb36558e7319a8cfc2..5261ad01f6b0d651c2c4c49e94112b31acbc8f03 100644 (file)
@@ -783,26 +783,34 @@ spf_process_txt_record (struct spf_record *rec, struct spf_resolved_element *res
         * or incorrect records (e.g. spf2 records)
         */
        LL_FOREACH (reply->entries, elt) {
-               if (strncmp (elt->content.txt.data, "v=spf1", sizeof ("v=spf1") - 1)
+               if (elt->type == RDNS_REQUEST_TXT) {
+                       if (strncmp(elt->content.txt.data, "v=spf1", sizeof("v=spf1") - 1)
                                == 0) {
-                       selected = elt;
-                       rspamd_mempool_set_variable (rec->task->task_pool,
-                                       RSPAMD_MEMPOOL_SPF_RECORD,
-                                       rspamd_mempool_strdup (rec->task->task_pool,
-                                                       elt->content.txt.data), NULL);
-                       break;
+                               selected = elt;
+                               rspamd_mempool_set_variable(rec->task->task_pool,
+                                               RSPAMD_MEMPOOL_SPF_RECORD,
+                                               rspamd_mempool_strdup (rec->task->task_pool,
+                                                               elt->content.txt.data), NULL);
+                               break;
+                       }
                }
        }
 
        if (!selected) {
                LL_FOREACH (reply->entries, elt) {
-                       if (start_spf_parse (rec, resolved, elt->content.txt.data)) {
-                               ret = TRUE;
-                               rspamd_mempool_set_variable (rec->task->task_pool,
-                                               RSPAMD_MEMPOOL_SPF_RECORD,
-                                               rspamd_mempool_strdup (rec->task->task_pool,
-                                                               elt->content.txt.data), NULL);
-                               break;
+                       /*
+                        * Rubbish spf record? Let's still try to process it, but merely for
+                        * TXT RRs
+                        */
+                       if (elt->type == RDNS_REQUEST_TXT) {
+                               if (start_spf_parse(rec, resolved, elt->content.txt.data)) {
+                                       ret = TRUE;
+                                       rspamd_mempool_set_variable(rec->task->task_pool,
+                                                       RSPAMD_MEMPOOL_SPF_RECORD,
+                                                       rspamd_mempool_strdup (rec->task->task_pool,
+                                                                       elt->content.txt.data), NULL);
+                                       break;
+                               }
                        }
                }
        }