it would be the dir with the first symlink. We still do not monitor
the entire path.
+JH/06 Check for bad chars in rDNS for sender_host_name. The OpenBSD (at least)
+ dn_expand() is happy to pass them through.
+
Exim version 4.96
-----------------
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
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
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;
}
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. */
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++; }