diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2012-04-16 17:26:19 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2012-04-16 17:26:19 +0100 |
commit | d1c759c5c13d18a27de51d9a1c6475df4ba47a08 (patch) | |
tree | 71c17a26b2225cfac149c2fa774a71cca6c6c5a6 | |
parent | e46164e0bd0426de7517e8afb3a604ea51e3d49f (diff) | |
download | dnsmasq-d1c759c5c13d18a27de51d9a1c6475df4ba47a08.tar.gz |
Answer CNAME queries correctly.v2.61rc2
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | src/rfc1035.c | 17 |
2 files changed, 20 insertions, 0 deletions
@@ -89,6 +89,9 @@ version 2.61 and the OpenStack team for the suggestion. Updated French translation. Thanks to Gildas Le Nadan. + + Give correct from-cache answers to explict CNAME queries. + Thanks to Rob Zwissler for spotting this. version 2.60 diff --git a/src/rfc1035.c b/src/rfc1035.c index 15abc25..3d7f3e5 100644 --- a/src/rfc1035.c +++ b/src/rfc1035.c @@ -1639,6 +1639,23 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, } while ((crecp = cache_find_by_name(crecp, name, now, flag | F_CNAME))); } } + + if (qtype == T_CNAME || qtype == T_ANY) + { + if ((crecp = cache_find_by_name(NULL, name, now, F_CNAME)) && + (qtype == T_CNAME || (crecp->flags & (F_HOSTS | F_DHCP)))) + { + ans = 1; + if (!dryrun) + { + log_query(crecp->flags, name, NULL, record_source(crecp->uid)); + if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, + crec_ttl(crecp, now), &nameoffset, + T_CNAME, C_IN, "d", cache_get_name(crecp->addr.cname.cache))) + anscount++; + } + } + } if (qtype == T_MX || qtype == T_ANY) { |