Since commit
9d8dbbc ("MINOR: dns: Maximum DNS udp payload set to 8192") it's
possible to specify a packet size, but passing too large a size or a negative
size is not detected and results in memset() being performed over a 2GB+ area
upon receipt of the first DNS response, causing runtime crashes.
We now check that the size is not smaller than the smallest packet which is
the DNS header size (12 bytes).
No backport is needed.
#define SRV_MAX_PREF_NET 5
/* DNS header size */
-#define DNS_HEADER_SIZE sizeof(struct dns_header)
+#define DNS_HEADER_SIZE ((int)sizeof(struct dns_header))
/* DNS resolution pool size, per resolvers section */
#define DNS_DEFAULT_RESOLUTION_POOL_SIZE 64
}
i = atoi(args[1]);
- if (i > DNS_MAX_UDP_MESSAGE) {
- Alert("parsing [%s:%d] : '%s' size %d exceeds maximum allowed size %d.\n",
- file, linenum, args[0], i, DNS_MAX_UDP_MESSAGE);
+ if (i < DNS_HEADER_SIZE || i > DNS_MAX_UDP_MESSAGE) {
+ Alert("parsing [%s:%d] : '%s' must be between %d and %d inclusive (was %s).\n",
+ file, linenum, args[0], DNS_HEADER_SIZE, DNS_MAX_UDP_MESSAGE, args[1]);
err_code |= ERR_ALERT | ERR_FATAL;
goto out;
}