diff options
Diffstat (limited to 'src/libserver/spf.c')
-rw-r--r-- | src/libserver/spf.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/libserver/spf.c b/src/libserver/spf.c index 12f1513d4..0800ad95b 100644 --- a/src/libserver/spf.c +++ b/src/libserver/spf.c @@ -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 ++; |