]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
1946. [bug] resume_dslookup() could trigger a REQUIRE failure
authorMark Andrews <marka@isc.org>
Tue, 3 Jan 2006 07:12:52 +0000 (07:12 +0000)
committerMark Andrews <marka@isc.org>
Tue, 3 Jan 2006 07:12:52 +0000 (07:12 +0000)
                        when using forwarders. [RT #15549]

CHANGES
lib/dns/resolver.c

diff --git a/CHANGES b/CHANGES
index 9689f33bd8a90ae1a5309ab16d5320ba073885f9..19eaa1efb4abc488e023b584d0090949e78f4201 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+1946.  [bug]           resume_dslookup() could trigger a REQUIRE failure
+                       when using forwarders. [RT #15549]
+
 1945.  [cleanup]       dnssec-keygen: RSA (RSAMD5) is nolonger recommended.
                        To generate a RSAMD5 key you must explictly request
                        RSAMD5. [RT #13780]
index 275561e0288249eaf120f909fa03e4d5f9f61f0a..553f55c83395efbb56d1b12790cb5cae27e07777 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.321 2005/11/30 22:51:58 marka Exp $ */
+/* $Id: resolver.c,v 1.322 2006/01/03 07:12:52 marka Exp $ */
 
 /*! \file */
 
@@ -4966,6 +4966,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) {
                fctx_try(fctx);
        } else {
                unsigned int n;
+               dns_rdataset_t *nsrdataset = NULL;
 
                /*
                 * Retrieve state from fctx->nsfetch before we destroy it.
@@ -4973,13 +4974,20 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) {
                dns_fixedname_init(&fixed);
                domain = dns_fixedname_name(&fixed);
                dns_name_copy(&fctx->nsfetch->private->domain, domain, NULL);
-               dns_rdataset_clone(&fctx->nsfetch->private->nameservers,
-                                  &nameservers);
-               dns_resolver_destroyfetch(&fctx->nsfetch);
                if (dns_name_equal(&fctx->nsname, domain)) {
                        fctx_done(fctx, DNS_R_SERVFAIL);
+                       dns_resolver_destroyfetch(&fctx->nsfetch);
                        goto cleanup;
                }
+               if (dns_rdataset_isassociated(
+                   &fctx->nsfetch->private->nameservers)) {
+                       dns_rdataset_clone(
+                           &fctx->nsfetch->private->nameservers,
+                           &nameservers);
+                       nsrdataset = &nameservers;
+               } else
+                       domain = NULL;
+               dns_resolver_destroyfetch(&fctx->nsfetch);
                n = dns_name_countlabels(&fctx->nsname);
                dns_name_getlabelsequence(&fctx->nsname, 1, n - 1,
                                          &fctx->nsname);
@@ -4989,7 +4997,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) {
                FCTXTRACE("continuing to look for parent's NS records");
                result = dns_resolver_createfetch(fctx->res, &fctx->nsname,
                                                  dns_rdatatype_ns, domain,
-                                                 &nameservers, NULL, 0, task,
+                                                 nsrdataset, NULL, 0, task,
                                                  resume_dslookup, fctx,
                                                  &fctx->nsrrset, NULL,
                                                  &fctx->nsfetch);