]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Further restrict addresses that are cached when processing referrals
authorMark Andrews <marka@isc.org>
Thu, 14 Aug 2025 04:35:46 +0000 (14:35 +1000)
committerMichał Kępień <michal@isc.org>
Thu, 2 Oct 2025 11:07:06 +0000 (13:07 +0200)
Use the owner name of the NS record as the bailwick apex name
when determining which additional records to cache, rather than
the name of the delegating zone (or a parent thereof).

(cherry picked from commit a41054e9e606a61f1b3c8bc0c54e2f1059347165)

lib/dns/resolver.c

index eb5d671c8f27240cec7da27608328fbde48774cb..4364f0ac19ff1e8744f9dab281ea4ec2e10d4094 100644 (file)
@@ -7141,7 +7141,8 @@ mark_related(dns_name_t *name, dns_rdataset_t *rdataset, bool external,
  * locally served zone.
  */
 static inline bool
-name_external(const dns_name_t *name, dns_rdatatype_t type, fetchctx_t *fctx) {
+name_external(const dns_name_t *name, dns_rdatatype_t type, respctx_t *rctx) {
+       fetchctx_t *fctx = rctx->fctx;
        isc_result_t result;
        dns_forwarders_t *forwarders = NULL;
        dns_fixedname_t fixed, zfixed;
@@ -7154,7 +7155,7 @@ name_external(const dns_name_t *name, dns_rdatatype_t type, fetchctx_t *fctx) {
        dns_namereln_t rel;
 
        apex = (ISDUALSTACK(fctx->addrinfo) || !ISFORWARDER(fctx->addrinfo))
-                      ? fctx->domain
+                      ? rctx->ns_name != NULL ? rctx->ns_name : fctx->domain
                       : fctx->fwdname;
 
        /*
@@ -7263,7 +7264,7 @@ check_section(void *arg, const dns_name_t *addname, dns_rdatatype_t type,
        result = dns_message_findname(rctx->query->rmessage, section, addname,
                                      dns_rdatatype_any, 0, &name, NULL);
        if (result == ISC_R_SUCCESS) {
-               external = name_external(name, type, fctx);
+               external = name_external(name, type, rctx);
                if (type == dns_rdatatype_a) {
                        for (rdataset = ISC_LIST_HEAD(name->list);
                             rdataset != NULL;
@@ -8923,7 +8924,7 @@ rctx_answer_scan(respctx_t *rctx) {
                        /*
                         * Don't accept DNAME from parent namespace.
                         */
-                       if (name_external(name, dns_rdatatype_dname, fctx)) {
+                       if (name_external(name, dns_rdatatype_dname, rctx)) {
                                continue;
                        }
 
@@ -9247,7 +9248,7 @@ rctx_authority_positive(respctx_t *rctx) {
                dns_message_currentname(rctx->query->rmessage,
                                        DNS_SECTION_AUTHORITY, &name);
 
-               if (!name_external(name, dns_rdatatype_ns, fctx) &&
+               if (!name_external(name, dns_rdatatype_ns, rctx) &&
                    dns_name_issubdomain(fctx->name, name))
                {
                        dns_rdataset_t *rdataset = NULL;