From: Diego Fronza Date: Wed, 15 Jan 2020 17:39:38 +0000 (-0300) Subject: Fixed crash when querying for non existing domain in chaos class X-Git-Tag: v9.16.0~48^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85555f29d78fe896a289b8c7c938b9833f4dcaa5;p=thirdparty%2Fbind9.git Fixed crash when querying for non existing domain in chaos class Function dns_view_findzonecut in view.c wasn't correctly handling classes other than IN (chaos, hesiod, etc) whenever the name being looked up wasn't in cache or in any of the configured zone views' database. That resulted in a NULL fname being used in resolver.c:4900, which in turn was triggering abort. --- diff --git a/lib/dns/view.c b/lib/dns/view.c index f21d065cfcf..38c6634a365 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -1245,8 +1245,9 @@ dns_view_findzonecut(dns_view_t *view, const dns_name_t *name, ztoptions |= DNS_ZTFIND_NOEXACT; result = dns_zt_find(view->zonetable, name, ztoptions, NULL, &zone); - } else + } else { result = ISC_R_NOTFOUND; + } UNLOCK(&view->lock); if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) result = dns_zone_getdb(zone, &db); @@ -1261,12 +1262,15 @@ dns_view_findzonecut(dns_view_t *view, const dns_name_t *name, * We have a cache; try it. */ dns_db_attach(view->cachedb, &db); - } else { + } else if (use_hints && view->hints != NULL) { /* * Maybe we have hints... */ try_hints = true; goto finish; + } else { + result = DNS_R_NXDOMAIN; + goto cleanup; } } else if (result != ISC_R_SUCCESS) { /* @@ -1287,6 +1291,7 @@ dns_view_findzonecut(dns_view_t *view, const dns_name_t *name, result = ISC_R_SUCCESS; else if (result != ISC_R_SUCCESS) goto cleanup; + if (use_cache && view->cachedb != NULL && db != view->hints) { /* * We found an answer, but the cache may be better. @@ -1327,13 +1332,16 @@ dns_view_findzonecut(dns_view_t *view, const dns_name_t *name, * have a zone delegation, so use it. */ use_zone = true; - } else { + result = ISC_R_SUCCESS; + } else if (use_hints && view->hints != NULL) { /* * Maybe we have hints... */ try_hints = true; + result = ISC_R_SUCCESS; + } else { + result = DNS_R_NXDOMAIN; } - result = ISC_R_SUCCESS; } else { /* * Something bad happened. @@ -1358,7 +1366,7 @@ dns_view_findzonecut(dns_view_t *view, const dns_name_t *name, if (sigrdataset != NULL && dns_rdataset_isassociated(&zrdataset)) dns_rdataset_clone(&zsigrdataset, sigrdataset); - } else if (try_hints && use_hints && view->hints != NULL) { + } else if (try_hints) { /* * We've found nothing so far, but we have hints. */