]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix spf parsing for A, MX and PTR records.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 May 2014 13:30:33 +0000 (14:30 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 1 May 2014 13:30:33 +0000 (14:30 +0100)
src/libserver/spf.c

index 12f1513d49587b4ad9020c587af119167e85ffef..0800ad95b11bc7425dc1bd01718b97fdfe52cf37 100644 (file)
@@ -603,20 +603,40 @@ static gboolean
 parse_spf_a (struct rspamd_task *task, const gchar *begin, struct spf_record *rec, struct spf_addr *addr)
 {
        struct spf_dns_cb *cb;
-       gchar                           *host;
+       gchar                           *host = NULL;
        
        CHECK_REC (rec);
        
-       if (begin == NULL || *begin != ':') {
+       /*
+        * a
+        * a/<prefix-length>
+        * a:<domain>
+        * a:<domain>/<prefix-length>
+        */
+       if (begin == NULL) {
+               return FALSE;
+       }
+       if (*begin == '\0') {
+               /* Use current domain only */
+               host = rec->cur_domain;
+               addr->data.normal.mask = 32;
+       }
+       else if (*begin == ':') {
+               begin ++;
+       }
+       else if (*begin != '/') {
+               /* Invalid A record */
                return FALSE;
        }
-       begin ++;
        
-       host = parse_spf_hostmask (task, begin, addr, rec);
+       if (host == NULL) {
+               host = parse_spf_hostmask (task, begin, addr, rec);
+       }
        
-       if (!host) {
+       if (host == NULL) {
                return FALSE;
        }
+
        rec->dns_requests ++;
        cb = rspamd_mempool_alloc (task->task_pool, sizeof (struct spf_dns_cb));
        cb->rec = rec;
@@ -641,7 +661,7 @@ parse_spf_ptr (struct rspamd_task *task, const gchar *begin, struct spf_record *
        
        msg_info ("<%s>: spf error for domain %s: ptr elements are not implemented",
                        rec->task->message_id, rec->sender_domain);
-       return FALSE;
+       return TRUE;
 }
 
 static gboolean
@@ -661,7 +681,7 @@ parse_spf_mx (struct rspamd_task *task, const gchar *begin, struct spf_record *r
        
        host = parse_spf_hostmask (task, begin, addr, rec);
        
-       if (!host) {
+       if (host == NULL) {
                return FALSE;
        }
        rec->dns_requests ++;