commit 8a24065: [Minor] Log bad elements in SPF records, relax some common mistakes
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue Sep 3 14:00:05 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-09-03 14:58:54 +0100
URL: https://github.com/rspamd/rspamd/commit/8a240656d8378ac20e4c4c3ae61d1a9c33488a20 (HEAD -> master)
[Minor] Log bad elements in SPF records, relax some common mistakes
---
src/libserver/spf.c | 58 ++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 49 insertions(+), 9 deletions(-)
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index 220e7adfa..02041b015 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -963,7 +963,7 @@ parse_spf_domain_mask (struct spf_record *rec, struct spf_addr *addr,
switch (state) {
case parse_spf_elt:
- if (t == ':') {
+ if (t == ':' || t == '=') {
state = parse_semicolon;
}
else if (t == '/') {
@@ -1011,7 +1011,8 @@ parse_spf_domain_mask (struct spf_record *rec, struct spf_addr *addr,
addr->m.dual.mask_v4 = cur_mask;
}
else {
- msg_info_spf ("bad ipv4 mask: %d", cur_mask);
+ msg_info_spf ("bad ipv4 mask for %s: %d",
+ rec->sender_domain, cur_mask);
}
state = parse_second_slash;
}
@@ -1041,7 +1042,7 @@ parse_spf_domain_mask (struct spf_record *rec, struct spf_addr *addr,
addr->m.dual.mask_v4 = cur_mask;
}
else {
- msg_info_spf ("bad ipv4 mask: %d", cur_mask);
+ msg_info_spf ("bad ipv4 mask for %s: %d", rec->sender_domain, cur_mask);
}
}
else if (state == parse_ipv6_mask) {
@@ -1228,7 +1229,13 @@ parse_spf_ip4 (struct spf_record *rec, struct spf_addr *addr)
semicolon = strchr (addr->spf_string, ':');
if (semicolon == NULL) {
- return FALSE;
+ semicolon = strchr (addr->spf_string, '=');
+
+ if (semicolon == NULL) {
+ msg_info_spf ("invalid ip4 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
+ return FALSE;
+ }
}
semicolon++;
@@ -1244,12 +1251,16 @@ parse_spf_ip4 (struct spf_record *rec, struct spf_addr *addr)
rspamd_strlcpy (ipbuf, semicolon, MIN (len + 1, sizeof (ipbuf)));
if (inet_pton (AF_INET, ipbuf, addr->addr4) != 1) {
+ msg_info_spf ("invalid ip4 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
return FALSE;
}
if (slash) {
mask = strtoul (slash + 1, NULL, 10);
if (mask > 32) {
+ msg_info_spf ("invalid mask for ip4 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
return FALSE;
}
@@ -1285,7 +1296,13 @@ parse_spf_ip6 (struct spf_record *rec, struct spf_addr *addr)
semicolon = strchr (addr->spf_string, ':');
if (semicolon == NULL) {
- return FALSE;
+ semicolon = strchr (addr->spf_string, '=');
+
+ if (semicolon == NULL) {
+ msg_info_spf ("invalid ip6 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
+ return FALSE;
+ }
}
semicolon++;
@@ -1301,12 +1318,16 @@ parse_spf_ip6 (struct spf_record *rec, struct spf_addr *addr)
rspamd_strlcpy (ipbuf, semicolon, MIN (len + 1, sizeof (ipbuf)));
if (inet_pton (AF_INET6, ipbuf, addr->addr6) != 1) {
+ msg_info_spf ("invalid ip6 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
return FALSE;
}
if (slash) {
mask = strtoul (slash + 1, NULL, 10);
if (mask > 128) {
+ msg_info_spf ("invalid mask for ip6 element for %s: %s", addr->spf_string,
+ rec->sender_domain);
return FALSE;
}
@@ -1341,7 +1362,14 @@ parse_spf_include (struct spf_record *rec, struct spf_addr *addr)
domain = strchr (addr->spf_string, ':');
if (domain == NULL) {
- return FALSE;
+ /* Common mistake */
+ domain = strchr (addr->spf_string, '=');
+
+ if (domain == NULL) {
+ msg_info_spf ("invalid include element for %s: %s", addr->spf_string,
+ rec->sender_domain);
+ return FALSE;
+ }
}
domain++;
@@ -1390,7 +1418,14 @@ parse_spf_redirect (struct spf_record *rec,
domain = strchr (addr->spf_string, '=');
if (domain == NULL) {
- return FALSE;
+ /* Common mistake */
+ domain = strchr (addr->spf_string, ':');
+
+ if (domain == NULL) {
+ msg_info_spf ("invalid redirect element for %s: %s", addr->spf_string,
+ rec->sender_domain);
+ return FALSE;
+ }
}
domain++;
@@ -1433,8 +1468,13 @@ parse_spf_exists (struct spf_record *rec, struct spf_addr *addr)
host = strchr (addr->spf_string, ':');
if (host == NULL) {
- msg_info_spf ("bad SPF exist record: %s", addr->spf_string);
- return FALSE;
+ host = strchr (addr->spf_string, '=');
+
+ if (host == NULL) {
+ msg_info_spf ("invalid exists element for %s: %s", addr->spf_string,
+ rec->sender_domain);
+ return FALSE;
+ }
}
host++;
More information about the Commits
mailing list