diff --git a/CHANGELOG b/CHANGELOG index 39b68a8..3122300 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -33,7 +33,12 @@ version 2.80 even if auth-sec-servers is not. Thanks to Raphaël Halimi for the suggestion. - + Fix bug which sometimes caused dnsmasq to wrongly return answers + without DNSSEC RRs to queries with the do-bit set, but only when + DNSSEC validation was not enabled. + Thanks to Petr Menšík for spotting this. + + version 2.79 Fix parsing of CNAME arguments, which are confused by extra spaces. Thanks to Diego Aguirre for spotting the bug. diff --git a/src/rfc1035.c b/src/rfc1035.c index ebb1f36..580f5ef 100644 --- a/src/rfc1035.c +++ b/src/rfc1035.c @@ -1663,7 +1663,9 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, } /* If the client asked for DNSSEC don't use cached data. */ - if ((crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG)) || !do_bit || !(crecp->flags & F_DNSSECOK)) + if ((crecp->flags & (F_HOSTS | F_DHCP | F_CONFIG)) || + !do_bit || + (option_bool(OPT_DNSSEC_VALID) && !(crecp->flags & F_DNSSECOK))) do { /* don't answer wildcard queries with data not from /etc/hosts @@ -1747,7 +1749,7 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, { if ((crecp = cache_find_by_name(NULL, name, now, F_CNAME | (dryrun ? F_NO_RR : 0))) && (qtype == T_CNAME || (crecp->flags & F_CONFIG)) && - ((crecp->flags & F_CONFIG) || !do_bit || !(crecp->flags & F_DNSSECOK))) + ((crecp->flags & F_CONFIG) || !do_bit || (option_bool(OPT_DNSSEC_VALID) && !(crecp->flags & F_DNSSECOK)))) { if (!(crecp->flags & F_DNSSECOK)) sec_data = 0;