diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-05-01 14:30:33 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-05-01 14:30:33 +0100 |
commit | e2e74a7f084016506cb2be71d919688891d9653e (patch) | |
tree | e8541b0a5a6ae125a4574f7146d075b04c6427fb /src/libserver | |
parent | 5c9400a2835bfc66bbd045ba3c45adde528592c4 (diff) | |
download | rspamd-e2e74a7f084016506cb2be71d919688891d9653e.tar.gz rspamd-e2e74a7f084016506cb2be71d919688891d9653e.zip |
Fix spf parsing for A, MX and PTR records.
Diffstat (limited to 'src/libserver')
-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 ++; |