]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2649. [bug] Set the domain for forward only zones. [RT #19944]
authorMark Andrews <marka@isc.org>
Thu, 13 Aug 2009 04:55:16 +0000 (04:55 +0000)
committerMark Andrews <marka@isc.org>
Thu, 13 Aug 2009 04:55:16 +0000 (04:55 +0000)
CHANGES
lib/dns/resolver.c

diff --git a/CHANGES b/CHANGES
index e52d2b8c1a8c357c6a695e2699d33088ff9675b1..4905de604745d8b58fbc2ecd9c43d2064058b39a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2649.  [bug]           Set the domain for forward only zones. [RT #19944]
+
 2648.  [port]          win32: isc_time_seconds() was broken. [RT #19900]
 
 2646.  [bug]           Incorrect cleanup on error in socket.c. [RT #19987]
index 0435c3b633cbbc5c2ff6c7ff64f5a42b5fdd0d07..cbb3e9ba73c606de9df522a83bb9ad8c0cab0210 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.284.18.92 2009/07/13 06:34:13 marka Exp $ */
+/* $Id: resolver.c,v 1.284.18.93 2009/08/13 04:55:16 marka Exp $ */
 
 /*! \file */
 
@@ -2297,6 +2297,16 @@ findname(fetchctx_t *fctx, dns_name_t *name, in_port_t port,
        }
 }
 
+static isc_boolean_t
+isstrictsubdomain(dns_name_t *name1, dns_name_t *name2) {
+       int order;
+       unsigned int nlabels;
+       dns_namereln_t namereln;
+
+       namereln = dns_name_fullcompare(name1, name2, &order, &nlabels);
+       return (ISC_TF(namereln == dns_namereln_subdomain));
+}
+
 static isc_result_t
 fctx_getaddresses(fetchctx_t *fctx) {
        dns_rdata_t rdata = DNS_RDATA_INIT;
@@ -2342,6 +2352,8 @@ fctx_getaddresses(fetchctx_t *fctx) {
                dns_name_t *name = &fctx->name;
                dns_name_t suffix;
                unsigned int labels;
+               dns_fixedname_t fixed;
+               dns_name_t *domain;
 
                /*
                 * DS records are found in the parent server.
@@ -2354,11 +2366,26 @@ fctx_getaddresses(fetchctx_t *fctx) {
                        dns_name_getlabelsequence(name, 1, labels - 1, &suffix);
                        name = &suffix;
                }
-               result = dns_fwdtable_find(fctx->res->view->fwdtable, name,
-                                          &forwarders);
+
+               dns_fixedname_init(&fixed);
+               domain = dns_fixedname_name(&fixed);
+               result = dns_fwdtable_find2(fctx->res->view->fwdtable, name,
+                                           domain, &forwarders);
                if (result == ISC_R_SUCCESS) {
                        sa = ISC_LIST_HEAD(forwarders->addrs);
                        fctx->fwdpolicy = forwarders->fwdpolicy;
+                       if (fctx->fwdpolicy == dns_fwdpolicy_only &&
+                           isstrictsubdomain(domain, &fctx->domain)) {
+                               isc_mem_t *mctx;
+
+                               mctx = res->buckets[fctx->bucketnum].mctx;
+                               dns_name_free(&fctx->domain, mctx);
+                               dns_name_init(&fctx->domain, NULL);
+                               result = dns_name_dup(domain, mctx,
+                                                     &fctx->domain);
+                               if (result != ISC_R_SUCCESS)
+                                       return (result);
+                       }
                }
        }