name = dns_fixedname_initname(&fname);
+ LOCK(&rpz->rpzs->maint_lock);
+
+ /* Check that we aren't shutting down. */
+ if (rpz->rpzs->zones[rpz->num] == NULL) {
+ UNLOCK(&rpz->rpzs->maint_lock);
+ goto cleanup;
+ }
+
for (result = isc_ht_iter_first(iter);
result == ISC_R_SUCCESS && count++ < DNS_RPZ_QUANTUM;
result = isc_ht_iter_delcurrent_next(iter))
iter, rpz, NULL, NULL);
nevent = &rpz->updateevent;
isc_task_send(rpz->rpzs->updater, &nevent);
+ UNLOCK(&rpz->rpzs->maint_lock);
return;
} else if (result == ISC_R_NOMORE) {
isc_ht_t *tmpht = NULL;
rpz->nodes = rpz->newnodes;
rpz->newnodes = tmpht;
+ UNLOCK(&rpz->rpzs->maint_lock);
finish_update(rpz);
dns_name_format(&rpz->origin, domain, DNS_NAME_FORMATSIZE);
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
DNS_LOGMODULE_MASTER, ISC_LOG_INFO,
"rpz: %s: reload done", domain);
+ } else {
+ UNLOCK(&rpz->rpzs->maint_lock);
}
/*
dns_name_format(&rpz->origin, domain, DNS_NAME_FORMATSIZE);
+ LOCK(&rpz->rpzs->maint_lock);
+
+ /* Check that we aren't shutting down. */
+ if (rpz->rpzs->zones[rpz->num] == NULL) {
+ UNLOCK(&rpz->rpzs->maint_lock);
+ goto cleanup;
+ }
+
while (result == ISC_R_SUCCESS && count++ < DNS_RPZ_QUANTUM) {
char namebuf[DNS_NAME_FORMATSIZE];
dns_rdatasetiter_t *rdsiter = NULL;
rpz, NULL, NULL);
nevent = &rpz->updateevent;
isc_task_send(rpz->rpzs->updater, &nevent);
+ UNLOCK(&rpz->rpzs->maint_lock);
return;
} else if (result == ISC_R_NOMORE) {
/*
NULL, rpz, NULL, NULL);
nevent = &rpz->updateevent;
isc_task_send(rpz->rpzs->updater, &nevent);
+ UNLOCK(&rpz->rpzs->maint_lock);
return;
}
/*
* If we're here, something went wrong, so clean up.
*/
+ UNLOCK(&rpz->rpzs->maint_lock);
+
+cleanup:
if (rpz->updbit != NULL) {
dns_dbiterator_destroy(&rpz->updbit);
}
if (dns_name_dynamic(&rpz->cname)) {
dns_name_free(&rpz->cname, rpzs->mctx);
}
- if (rpz->dbversion != NULL) {
- dns_db_closeversion(rpz->db, &rpz->dbversion, false);
- }
if (rpz->db != NULL) {
+ if (rpz->dbversion != NULL) {
+ dns_db_closeversion(rpz->db, &rpz->dbversion,
+ false);
+ }
dns_db_updatenotify_unregister(
rpz->db, dns_rpz_dbupdate_callback, rpz);
dns_db_detach(&rpz->db);
if (rpz->newnodes != NULL) {
isc_ht_destroy(&rpz->newnodes);
}
- dns_db_closeversion(rpz->updb, &rpz->updbversion,
- false);
- dns_db_detach(&rpz->updb);
+ if (rpz->updb != NULL) {
+ if (rpz->updbversion != NULL) {
+ dns_db_closeversion(rpz->updb,
+ &rpz->updbversion,
+ false);
+ }
+ dns_db_detach(&rpz->updb);
+ }
}
isc_timer_reset(rpz->updatetimer, isc_timertype_inactive, NULL,
*rpzsp = NULL;
if (isc_refcount_decrement(&rpzs->refs) == 1) {
- isc_task_destroy(&rpzs->updater);
-
+ LOCK(&rpzs->maint_lock);
/*
* Forget the last of view's rpz machinery after
* the last reference.
rpz_detach(&rpz);
}
}
+ UNLOCK(&rpzs->maint_lock);
rpz_detach_rpzs(&rpzs);
}
}
if (rpzs->rbt != NULL) {
dns_rbt_destroy(&rpzs->rbt);
}
+ isc_task_destroy(&rpzs->updater);
isc_mutex_destroy(&rpzs->maint_lock);
isc_rwlock_destroy(&rpzs->search_lock);
isc_refcount_destroy(&rpzs->refs);