]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add dns_view_delzone
authorMark Andrews <marka@isc.org>
Wed, 31 May 2023 02:59:03 +0000 (12:59 +1000)
committerOndřej Surý <ondrej@isc.org>
Thu, 1 Jun 2023 14:51:38 +0000 (16:51 +0200)
dns_view_delzone performs the rcu locking required around accessing
view->zonetable.

bin/named/server.c
lib/dns/include/dns/view.h
lib/dns/view.c

index 071fe0c511ab605c7a70390570256328612f95bf..425fdcc871683a316eb99244f9810ed09b95f6d7 100644 (file)
@@ -2856,7 +2856,7 @@ catz_addmodzone_cb(void *arg) {
                }
 
                /* Remove the zone from the zone table */
-               dns_zt_unmount(cz->view->zonetable, zone);
+               dns_view_delzone(cz->view, zone);
                goto cleanup;
        }
 
@@ -2925,7 +2925,7 @@ catz_delzone_cb(void *arg) {
                dns_zone_unload(zone);
        }
 
-       CHECK(dns_zt_unmount(cz->view->zonetable, zone));
+       CHECK(dns_view_delzone(cz->view, zone));
        file = dns_zone_getfile(zone);
        if (file != NULL) {
                isc_file_remove(file);
@@ -13551,7 +13551,7 @@ do_addzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
                }
 
                /* Remove the zone from the zone table */
-               dns_zt_unmount(view->zonetable, zone);
+               dns_view_delzone(view, zone);
                goto cleanup;
        }
 
@@ -13759,7 +13759,7 @@ do_modzone(named_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
                }
 
                /* Remove the zone from the zone table */
-               dns_zt_unmount(view->zonetable, zone);
+               dns_view_delzone(view, zone);
                goto cleanup;
        }
 
@@ -14147,7 +14147,7 @@ named_server_delzone(named_server_t *server, isc_lex_t *lex,
        if (dns_zone_gettype(zone) == dns_zone_redirect) {
                dns_zone_detach(&view->redirect);
        } else {
-               CHECK(dns_zt_unmount(view->zonetable, zone));
+               CHECK(dns_view_delzone(view, zone));
        }
 
        /* Send cleanup event */
index e801b3a30f2702bcde15bfdb1806b6dd6415e5a6..aa0a650f0b4f9ac04928b9857f8629f4d58fd447 100644 (file)
@@ -493,6 +493,16 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone);
  *\li  'zone' is a valid zone.
  */
 
+isc_result_t
+dns_view_delzone(dns_view_t *view, dns_zone_t *zone);
+/*%<
+ * Removes zone 'zone' from 'view'.
+ *
+ * Requires:
+ *
+ *\li  'zone' is a valid zone.
+ */
+
 void
 dns_view_freeze(dns_view_t *view);
 /*%<
index 7349ae6f82ed2807d02501a09e3f779717a127e8..809223f67dfc60b31b868281eaef58562ec40775 100644 (file)
@@ -787,6 +787,25 @@ dns_view_addzone(dns_view_t *view, dns_zone_t *zone) {
        return (result);
 }
 
+isc_result_t
+dns_view_delzone(dns_view_t *view, dns_zone_t *zone) {
+       isc_result_t result;
+       dns_zt_t *zonetable = NULL;
+
+       REQUIRE(DNS_VIEW_VALID(view));
+
+       rcu_read_lock();
+       zonetable = rcu_dereference(view->zonetable);
+       if (zonetable != NULL) {
+               result = dns_zt_unmount(zonetable, zone);
+       } else {
+               result = ISC_R_SUCCESS;
+       }
+       rcu_read_unlock();
+
+       return (result);
+}
+
 isc_result_t
 dns_view_findzone(dns_view_t *view, const dns_name_t *name,
                  dns_zone_t **zonep) {