diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2022-08-09 10:57:56 +0100 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2022-08-09 10:57:56 +0100 |
commit | b855ee2fb3776667c8b08aa6b80453d60e4fb509 (patch) | |
tree | b63515a8605cdc60f872f2b6c1b2f7f63c6f9ecd /src | |
parent | ef57b25bfa7623c3f8a8e65f927165c4ddc7c43b (diff) |
Filter rDNS returns for bad chars
Diffstat (limited to 'src')
-rw-r--r-- | src/src/globals.c | 4 | ||||
-rw-r--r-- | src/src/globals.h | 1 | ||||
-rw-r--r-- | src/src/host.c | 17 |
3 files changed, 17 insertions, 5 deletions
diff --git a/src/src/globals.c b/src/src/globals.c index c95d24b47..574ee60a4 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -1016,6 +1016,10 @@ uschar *keep_environment = NULL; int keep_malformed = 4*24*60*60; /* 4 days */ uschar *eldap_dn = NULL; +const uschar *letter_digit_hyphen_dot = + US"abcdefghijklmnopqrstuvwxyz" + ".-0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; #ifdef EXPERIMENTAL_ESMTP_LIMITS uschar *limits_advertise_hosts = US"*"; #endif diff --git a/src/src/globals.h b/src/src/globals.h index c9ef5e484..3f3c798b7 100644 --- a/src/src/globals.h +++ b/src/src/globals.h @@ -680,6 +680,7 @@ extern uschar *keep_environment; /* Whitelist for environment variables */ extern int keep_malformed; /* Time to keep malformed messages */ extern uschar *eldap_dn; /* Where LDAP DNs are left */ +extern const uschar *letter_digit_hyphen_dot; /* Legitimate DNS host name chars */ #ifdef EXPERIMENTAL_ESMTP_LIMITS extern uschar *limits_advertise_hosts; /* for banner/EHLO pipelining */ #endif diff --git a/src/src/host.c b/src/src/host.c index fed9f4b5f..b6c2ea082 100644 --- a/src/src/host.c +++ b/src/src/host.c @@ -84,13 +84,13 @@ random_number(int limit) if (limit < 1) return 0; if (random_seed == 0) - { - if (f.running_in_test_harness) random_seed = 42; else + if (f.running_in_test_harness) + random_seed = 42; + else { int p = (int)getpid(); random_seed = (int)time(NULL) ^ ((p << 16) | p); } - } random_seed = 1103515245 * random_seed + 12345; return (unsigned int)(random_seed >> 16) % limit; } @@ -1646,6 +1646,7 @@ while ((ordername = string_nextinlist(&list, &sep, NULL, 0))) rr = dns_next_rr(dnsa, &dnss, RESET_NEXT)) if (rr->type == T_PTR) { uschar * s = store_get(ssize, GET_TAINTED); /* names are tainted */ + unsigned slen; /* If an overlong response was received, the data will have been truncated and dn_expand may fail. */ @@ -1658,13 +1659,19 @@ while ((ordername = string_nextinlist(&list, &sep, NULL, 0))) break; } - store_release_above(s + Ustrlen(s) + 1); - if (!s[0]) + store_release_above(s + (slen = Ustrlen(s)) + 1); + if (!*s) { HDEBUG(D_host_lookup) debug_printf("IP address lookup yielded an " "empty name: treated as non-existent host name\n"); continue; } + if (Ustrspn(s, letter_digit_hyphen_dot) != slen) + { + HDEBUG(D_host_lookup) debug_printf("IP address lookup yielded an " + "illegal name (bad char): treated as non-existent host name\n"); + continue; + } if (!sender_host_name) sender_host_name = s; else *aptr++ = s; while (*s) { *s = tolower(*s); s++; } |