From: Mark Andrews Date: Tue, 3 Jan 2006 07:12:52 +0000 (+0000) Subject: 1946. [bug] resume_dslookup() could trigger a REQUIRE failure X-Git-Tag: v9.2.7b1~91^2~56 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=1c91b0a6516319d81670da2325e2bd08a7703707;p=thirdparty%2Fbind9.git 1946. [bug] resume_dslookup() could trigger a REQUIRE failure when using forwarders. [RT #15549] --- diff --git a/CHANGES b/CHANGES index 9689f33bd8a..19eaa1efb4a 100644 --- 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] diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 275561e0288..553f55c8339 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -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);