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

index 228ae87064e66c60b8abe6ab71259410f611939e..8b2f92eb395586775005b39394266def714b69ea 100644 (file)
@@ -3713,7 +3713,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,
@@ -3789,7 +3789,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);
@@ -3869,7 +3869,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 24d49be07662ecd86870b735d4b660ef000c9cee..59a5d2714e1943e0c3c13688364e53836571368a 100644 (file)
@@ -561,8 +561,9 @@ dialup(dns_zone_t *zone, void *dummy) {
 void
 dns_view_dialup(dns_view_t *view) {
        REQUIRE(DNS_VIEW_VALID(view));
-       if (view->zonetable != NULL)
-               (void)dns_zt_apply(view->zonetable, ISC_FALSE, dialup, NULL);
+       REQUIRE(view->zonetable != NULL);
+
+       (void)dns_zt_apply(view->zonetable, ISC_FALSE, dialup, NULL);
 }
 
 void
@@ -887,6 +888,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) {
@@ -895,6 +897,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);
 }
@@ -949,12 +952,14 @@ dns_view_find2(dns_view_t *view, dns_name_t *name, dns_rdatatype_t type,
        node = NULL;
        is_staticstub_zone = ISC_FALSE;
        zone = NULL;
-       if (view->zonetable != NULL) {
+       LOCK(&view->lock);
+       if (view->zonetable != NULL)
                result = dns_zt_find(view->zonetable, name, 0, NULL, &zone);
-               if (zone != NULL && !use_static_stub &&
-                   dns_zone_gettype(zone) == dns_zone_staticstub)
-                       result = ISC_R_NOTFOUND;
-       } else
+       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;
        if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
                result = dns_zone_getdb(zone, &db);
@@ -1208,10 +1213,12 @@ dns_view_findzonecut2(dns_view_t *view, dns_name_t *name, dns_name_t *fname,
         * Find the right database.
         */
        zone = NULL;
+       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) {
@@ -1397,11 +1404,13 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name,
                 * treat it as not found.
                 */
                zp = (zone1 == NULL) ? &zone1 : &zone2;
+               LOCK(&view->lock);
                if (view->zonetable != NULL)
-                       result = dns_zt_find(view->zonetable, name, 0, NULL,
-                                            zp);
+                       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);
@@ -1682,6 +1691,7 @@ 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);
 
@@ -1708,6 +1718,7 @@ dns_view_getadbstats(dns_view_t *view, isc_stats_t **statsp) {
 
 void
 dns_view_setresstats(dns_view_t *view, isc_stats_t *stats) {
+
        REQUIRE(DNS_VIEW_VALID(view));
        REQUIRE(!view->frozen);
        REQUIRE(view->resstats == NULL);