]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fixed crash when querying for non existing domain in chaos class
authorDiego Fronza <diego@isc.org>
Wed, 15 Jan 2020 17:39:38 +0000 (14:39 -0300)
committerEvan Hunt <each@isc.org>
Wed, 22 Jan 2020 20:25:33 +0000 (12:25 -0800)
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.

(cherry picked from commit 85555f29d78fe896a289b8c7c938b9833f4dcaa5)

lib/dns/view.c

index 31a979294c1c117b9a462841ba2afa48291128da..333b8128f2e990fb6292680ec343d6d3b6ab1f43 100644 (file)
@@ -1272,8 +1272,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);
@@ -1288,12 +1289,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) {
                /*
@@ -1314,6 +1318,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.
@@ -1354,13 +1359,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.
@@ -1385,7 +1393,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.
                 */