]> 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:25:35 +0000 (11:25 +1000)
committerMark Andrews <marka@isc.org>
Tue, 4 Jun 2013 01:25:35 +0000 (11:25 +1000)
lib/dns/validator.c
lib/dns/view.c

index e93019d76997600189b6acb71c9ea4cea2dbdbb4..d33a683c5d31ce746d9af106c6fde3200736edfb 100644 (file)
@@ -3715,7 +3715,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,
@@ -3791,7 +3791,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);
@@ -3871,7 +3871,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 5b6ad6587d2095026000f2a3369c82a05abdf620..feacdab885cb4f9f88d8f426cfd8debdfe33588e 100644 (file)
@@ -547,6 +547,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);
 }
 #endif
@@ -855,6 +857,7 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
 
        REQUIRE(DNS_VIEW_VALID(view));
        REQUIRE(!view->frozen);
+       REQUIRE(view->zonetable != NULL);
 
        result = dns_zt_mount(view->zonetable, zone);
 
@@ -869,6 +872,7 @@ dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
 
        REQUIRE(DNS_VIEW_VALID(view));
 
+       LOCK(&view->lock);
        if (view->zonetable != NULL) {
                result = dns_zt_find(view->zonetable, name, 0, NULL, zonep);
                if (result == DNS_R_PARTIALMATCH) {
@@ -877,6 +881,7 @@ dns_view_findzone(dns_view_t *view, dns_name_t *name, dns_zone_t **zonep) {
                }
        } else
                result = ISC_R_NOTFOUND;
+       UNLOCK(&view->lock);
 
        return (result);
 }
@@ -939,7 +944,12 @@ dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        is_staticstub_zone = ISC_FALSE;
 #ifdef BIND9
        zone = 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 (zone != NULL && dns_zone_gettype(zone) == dns_zone_staticstub &&
            !use_static_stub) {
                result = ISC_R_NOTFOUND;
@@ -1210,9 +1220,14 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
         */
 #ifdef BIND9
        zone = 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;
        if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH)
                result = dns_zone_getdb(zone, &db);
+       UNLOCK(&view->lock);
 #else
        result = ISC_R_NOTFOUND;
 #endif
@@ -1402,7 +1417,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);
@@ -1434,6 +1455,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));
 }
@@ -1442,6 +1464,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));
 }
@@ -1674,13 +1697,17 @@ dns_view_getrootdelonly(dns_view_t *view) {
 #ifdef BIND9
 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));
 }
 #endif
 
 void
 dns_view_setresstats(dns_view_t *view, isc_stats_t *stats) {
+
        REQUIRE(DNS_VIEW_VALID(view));
        REQUIRE(!view->frozen);
        REQUIRE(view->resstats == NULL);