]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
redo: 3576. [bug] Address a shutdown race when validating. [RT #33573]
authorMark Andrews <marka@isc.org>
Tue, 4 Jun 2013 01:24:46 +0000 (11:24 +1000)
committerMark Andrews <marka@isc.org>
Tue, 4 Jun 2013 01:24:46 +0000 (11:24 +1000)
lib/dns/validator.c
lib/dns/view.c

index eac80704744a6dc6cedf74e510c3fd186df79f73..dffbbe8695ffb12a7e93db93c3b9a6d4def968f2 100644 (file)
@@ -3659,7 +3659,7 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        if (val == NULL)
                return (ISC_R_NOMEMORY);
        val->view = NULL;
-       dns_view_attach(view, &val->view);
+       dns_view_weakattach(view, &val->view);
 
        event = (dns_validatorevent_t *)
                isc_event_allocate(view->mctx, task,
@@ -3729,7 +3729,7 @@ dns_validator_create(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        isc_event_free(ISC_EVENT_PTR(&event));
 
  cleanup_val:
-       dns_view_detach(&val->view);
+       dns_view_weakdetach(&val->view);
        isc_mem_put(view->mctx, val, sizeof(*val));
 
        return (result);
@@ -3809,7 +3809,7 @@ destroy(dns_validator_t *val) {
        if (val->siginfo != NULL)
                isc_mem_put(mctx, val->siginfo, sizeof(*val->siginfo));
        DESTROYLOCK(&val->lock);
-       dns_view_detach(&val->view);
+       dns_view_weakdetach(&val->view);
        val->magic = 0;
        isc_mem_put(mctx, val, sizeof(*val));
 }
index ec57f4c0ef5ba17f046cdb9d145619f4438b8657..cf5ce30f1b32bf05fde62f0ce1c0c87c5f0cfd21 100644 (file)
@@ -452,6 +452,8 @@ dialup(dns_zone_t *zone, void *dummy) {
 void
 dns_view_dialup(dns_view_t *view) {
        REQUIRE(DNS_VIEW_VALID(view));
+       REQUIRE(view->zonetable != NULL);
+
        (void)dns_zt_apply(view->zonetable, ISC_FALSE, dialup, NULL);
 }
 
@@ -707,11 +709,16 @@ dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
 
        REQUIRE(DNS_VIEW_VALID(view));
 
-       result = dns_zt_find(view->zonetable, name, 0, NULL, zonep);
-       if (result == DNS_R_PARTIALMATCH) {
-               dns_zone_detach(zonep);
+       LOCK(&view->lock);
+       if (view->zonetable != NULL) {
+               result = dns_zt_find(view->zonetable, name, 0, NULL, zonep);
+               if (result == DNS_R_PARTIALMATCH) {
+                       dns_zone_detach(zonep);
+                       result = ISC_R_NOTFOUND;
+               }
+       } else
                result = ISC_R_NOTFOUND;
-       }
+       UNLOCK(&view->lock);
 
        return (result);
 }
@@ -754,7 +761,12 @@ dns_view_find(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        zone = NULL;
        db = NULL;
        node = NULL;
-       result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+       LOCK(&view->lock);
+       if (view->zonetable != NULL)
+               result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+       else
+               result = ISC_R_NOTFOUND;
+       UNLOCK(&view->lock);
        if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
                result = dns_zone_getdb(zone, &db);
                if (result != ISC_R_SUCCESS && view->cachedb != NULL)
@@ -1001,7 +1013,12 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
        /*
         * Find the right database.
         */
-       result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+       LOCK(&view->lock);
+       if (view->zonetable != NULL)
+               result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
+       else
+               result = ISC_R_NOTFOUND;
+       UNLOCK(&view->lock);
        if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
                result = dns_zone_getdb(zone, &db);
        if (result == ISC_R_NOTFOUND) {
@@ -1185,7 +1202,13 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name,
                 * treat it as not found.
                 */
                zp = (zone1 == NULL) ? &zone1 : &zone2;
-               result = dns_zt_find(view->zonetable, name, 0, NULL, zp);
+               LOCK(&view->lock);
+               if (view->zonetable != NULL)
+                       result = dns_zt_find(view->zonetable, name, 0,
+                                            NULL, zp);
+               else
+                       result = ISC_R_NOTFOUND;
+               UNLOCK(&view->lock);
                INSIST(result == ISC_R_SUCCESS ||
                       result == ISC_R_NOTFOUND ||
                       result == DNS_R_PARTIALMATCH);
@@ -1217,6 +1240,7 @@ isc_result_t
 dns_view_load(dns_view_t *view, isc_boolean_t stop) {
 
        REQUIRE(DNS_VIEW_VALID(view));
+       REQUIRE(view->zonetable != NULL);
 
        return (dns_zt_load(view->zonetable, stop));
 }
@@ -1225,6 +1249,7 @@ isc_result_t
 dns_view_loadnew(dns_view_t *view, isc_boolean_t stop) {
 
        REQUIRE(DNS_VIEW_VALID(view));
+       REQUIRE(view->zonetable != NULL);
 
        return (dns_zt_loadnew(view->zonetable, stop));
 }
@@ -1442,12 +1467,16 @@ dns_view_getrootdelonly(dns_view_t *view) {
 
 isc_result_t
 dns_view_freezezones(dns_view_t *view, isc_boolean_t value) {
+
        REQUIRE(DNS_VIEW_VALID(view));
+       REQUIRE(view->zonetable != NULL);
+
        return (dns_zt_freezezones(view->zonetable, value));
 }
 
 void
 dns_view_setresstats(dns_view_t *view, isc_stats_t *stats) {
+
        REQUIRE(DNS_VIEW_VALID(view));
        REQUIRE(!view->frozen);
        REQUIRE(view->resstats == NULL);