diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-01-19 21:09:07 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-01-19 21:09:07 +0000 |
commit | 90423f14149b871c6ce8b78211b17f6d7aee6ef9 (patch) | |
tree | 8207b74c33bfb9a874ca2c123a32f5ae24829780 /src/libserver/spf.c | |
parent | d7917e831cfc1c34ce2631059efb610797729b5d (diff) | |
download | rspamd-90423f14149b871c6ce8b78211b17f6d7aee6ef9.tar.gz rspamd-90423f14149b871c6ce8b78211b17f6d7aee6ef9.zip |
Fix issue with SPF double IP stack
Issue: #483
Diffstat (limited to 'src/libserver/spf.c')
-rw-r--r-- | src/libserver/spf.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/libserver/spf.c b/src/libserver/spf.c index cef96e0b8..da392028b 100644 --- a/src/libserver/spf.c +++ b/src/libserver/spf.c @@ -450,6 +450,8 @@ spf_record_process_addr (struct spf_record *rec, struct spf_addr *addr, struct "internal error, bad DNS reply is treated as address: %s", rdns_strtype (reply->type)); } + + addr->flags |= RSPAMD_SPF_FLAG_PROCESSED; } else { /* We need to create a new address */ @@ -482,26 +484,24 @@ static void spf_record_addr_set (struct spf_addr *addr, gboolean allow_any) { guchar fill; - guint maskv4, maskv6; - if (allow_any) { - fill = 0; - maskv4 = 0; - maskv6 = 0; - } - else { - fill = 0xff; - maskv4 = 32; - maskv6 = 128; - } + if (!(addr->flags & RSPAMD_SPF_FLAG_PROCESSED)) { + if (allow_any) { + fill = 0; + addr->m.dual.mask_v4 = 0; + addr->m.dual.mask_v6 = 0; + } + else { + fill = 0xff; + } - memset (addr->addr4, fill, sizeof (addr->addr4)); - memset (addr->addr6, fill, sizeof (addr->addr6)); - addr->m.dual.mask_v4 = maskv4; - addr->m.dual.mask_v6 = maskv6; + memset (addr->addr4, fill, sizeof (addr->addr4)); + memset (addr->addr6, fill, sizeof (addr->addr6)); - addr->flags |= RSPAMD_SPF_FLAG_IPV4; - addr->flags |= RSPAMD_SPF_FLAG_IPV6; + + addr->flags |= RSPAMD_SPF_FLAG_IPV4; + addr->flags |= RSPAMD_SPF_FLAG_IPV6; + } } static gboolean @@ -638,8 +638,8 @@ spf_record_dns_callback (struct rdns_reply *reply, gpointer arg) case SPF_RESOLVE_EXP: break; case SPF_RESOLVE_EXISTS: - if (elt_data->type == RDNS_REQUEST_A || elt_data->type == - RDNS_REQUEST_AAAA) { + if (elt_data->type == RDNS_REQUEST_A || + elt_data->type == RDNS_REQUEST_AAAA) { /* If specified address resolves, we can accept connection from every IP */ spf_record_addr_set (addr, TRUE); } |