aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2014-05-01 14:30:33 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2014-05-01 14:30:33 +0100
commite2e74a7f084016506cb2be71d919688891d9653e (patch)
treee8541b0a5a6ae125a4574f7146d075b04c6427fb /src/libserver
parent5c9400a2835bfc66bbd045ba3c45adde528592c4 (diff)
downloadrspamd-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.c34
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 ++;