Also return REFUSED and not SERVFAIL when out of memory.
Thanks to Allain Legacy for problem report.
reading a hosts-file fails. Thanks to André Glüpker
for the patch.
+ Fix wrong answer to simple name query when --domain-needed
+ set, but no upstream servers configured. Dnsmasq returned
+ REFUSED, in this case, when it should be the same as when
+ upstream servers are configured - NOERROR. Thanks to
+ Allain Legacy for spotting the problem.
+
+ Return REFUSED when running out of forwarding table slots,
+ not SERVFAIL.
+
version 2.75
Fix reversion on 2.74 which caused 100% CPU use when a
(void)do_bit;
/* may be no servers available. */
- if (!daemon->servers)
- forward = NULL;
- else if (forward || (hash && (forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, hash))))
+ if (forward || (hash && (forward = lookup_frec_by_sender(ntohs(header->id), udpaddr, hash))))
{
/* If we didn't get an answer advertising a maximal packet in EDNS,
fall back to 1280, which should work everywhere on IPv6.
#endif
type &= ~SERV_DO_DNSSEC;
- if (!flags && !(forward = get_new_frec(now, NULL, 0)))
- /* table full - server failure. */
- flags = F_NEG;
+ if (daemon->servers && !flags)
+ forward = get_new_frec(now, NULL, 0);
+ /* table full - flags == 0, return REFUSED */
if (forward)
{
unsigned int mark = 0;
int have_mark = 0;
+ (void)mark;
+ (void)have_mark;
+
if (getpeername(confd, (struct sockaddr *)&peer_addr, &peer_len) == -1)
return packet;
header->nscount = htons(0);
header->arcount = htons(0);
header->ancount = htons(0); /* no answers unless changed below */
- if (flags == F_NEG)
- SET_RCODE(header, SERVFAIL); /* couldn't get memory */
- else if (flags == F_NOERR)
+ if (flags == F_NOERR)
SET_RCODE(header, NOERROR); /* empty domain */
else if (flags == F_NXDOMAIN)
SET_RCODE(header, NXDOMAIN);