|
|
82c9ab |
From fff2960981a3294ac641968a17558c8d7eecf74d Mon Sep 17 00:00:00 2001
|
|
|
82c9ab |
From: Mark Andrews <marka@isc.org>
|
|
|
82c9ab |
Date: Wed, 24 Aug 2022 12:21:50 +1000
|
|
|
82c9ab |
Subject: [PATCH] Have dns_zt_apply lock the zone table
|
|
|
82c9ab |
|
|
|
82c9ab |
There where a number of places where the zone table should have
|
|
|
82c9ab |
been locked, but wasn't, when dns_zt_apply was called.
|
|
|
82c9ab |
|
|
|
82c9ab |
Added a isc_rwlocktype_t type parameter to dns_zt_apply and adjusted
|
|
|
82c9ab |
all calls to using it. Removed locks in callers.
|
|
|
82c9ab |
|
|
|
82c9ab |
Modified upstream commit for v9_11
|
|
|
82c9ab |
---
|
|
|
82c9ab |
bin/named/server.c | 11 ++++++-----
|
|
|
82c9ab |
bin/named/statschannel.c | 8 ++++----
|
|
|
82c9ab |
lib/dns/include/dns/zt.h | 4 ++--
|
|
|
82c9ab |
lib/dns/tests/zt_test.c | 3 ++-
|
|
|
82c9ab |
lib/dns/view.c | 3 ++-
|
|
|
82c9ab |
lib/dns/zt.c | 34 +++++++++++++++++++---------------
|
|
|
82c9ab |
6 files changed, 35 insertions(+), 28 deletions(-)
|
|
|
82c9ab |
|
|
|
82c9ab |
diff --git a/bin/named/server.c b/bin/named/server.c
|
|
|
82c9ab |
index 9826588e6d..0b4b309461 100644
|
|
|
82c9ab |
--- a/bin/named/server.c
|
|
|
82c9ab |
+++ b/bin/named/server.c
|
|
|
82c9ab |
@@ -8723,8 +8723,8 @@ load_configuration(const char *filename, ns_server_t *server,
|
|
|
82c9ab |
strcmp(view->name, "_bind") != 0)
|
|
|
82c9ab |
{
|
|
|
82c9ab |
dns_view_setviewrevert(view);
|
|
|
82c9ab |
- (void)dns_zt_apply(view->zonetable, false,
|
|
|
82c9ab |
- removed, view);
|
|
|
82c9ab |
+ (void)dns_zt_apply(view->zonetable, isc_rwlocktype_read,
|
|
|
82c9ab |
+ false, removed, view);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
dns_view_detach(&view);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
@@ -10090,8 +10090,8 @@ add_view_tolist(struct dumpcontext *dctx, dns_view_t *view) {
|
|
|
82c9ab |
ISC_LIST_INIT(vle->zonelist);
|
|
|
82c9ab |
ISC_LIST_APPEND(dctx->viewlist, vle, link);
|
|
|
82c9ab |
if (dctx->dumpzones)
|
|
|
82c9ab |
- result = dns_zt_apply(view->zonetable, true,
|
|
|
82c9ab |
- add_zone_tolist, dctx);
|
|
|
82c9ab |
+ result = dns_zt_apply(view->zonetable, isc_rwlocktype_read,
|
|
|
82c9ab |
+ true, add_zone_tolist, dctx);
|
|
|
82c9ab |
return (result);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
@@ -11367,7 +11367,8 @@ ns_server_sync(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text) {
|
|
|
82c9ab |
for (view = ISC_LIST_HEAD(server->viewlist);
|
|
|
82c9ab |
view != NULL;
|
|
|
82c9ab |
view = ISC_LIST_NEXT(view, link)) {
|
|
|
82c9ab |
- result = dns_zt_apply(view->zonetable, false,
|
|
|
82c9ab |
+ result = dns_zt_apply(view->zonetable,
|
|
|
82c9ab |
+ isc_rwlocktype_none, false,
|
|
|
82c9ab |
synczone, &cleanup);
|
|
|
82c9ab |
if (result != ISC_R_SUCCESS &&
|
|
|
82c9ab |
tresult == ISC_R_SUCCESS)
|
|
|
82c9ab |
diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c
|
|
|
82c9ab |
index 12ab048469..9828df0f4e 100644
|
|
|
82c9ab |
--- a/bin/named/statschannel.c
|
|
|
82c9ab |
+++ b/bin/named/statschannel.c
|
|
|
82c9ab |
@@ -1833,8 +1833,8 @@ generatexml(ns_server_t *server, uint32_t flags,
|
|
|
82c9ab |
if ((flags & STATS_XML_ZONES) != 0) {
|
|
|
82c9ab |
TRY0(xmlTextWriterStartElement(writer,
|
|
|
82c9ab |
ISC_XMLCHAR "zones"));
|
|
|
82c9ab |
- result = dns_zt_apply(view->zonetable, true,
|
|
|
82c9ab |
- zone_xmlrender, writer);
|
|
|
82c9ab |
+ result = dns_zt_apply(view->zonetable, isc_rwlocktype_read,
|
|
|
82c9ab |
+ true, zone_xmlrender, writer);
|
|
|
82c9ab |
if (result != ISC_R_SUCCESS)
|
|
|
82c9ab |
goto error;
|
|
|
82c9ab |
TRY0(xmlTextWriterEndElement(writer)); /* /zones */
|
|
|
82c9ab |
@@ -2489,8 +2489,8 @@ generatejson(ns_server_t *server, size_t *msglen,
|
|
|
82c9ab |
CHECKMEM(za);
|
|
|
82c9ab |
|
|
|
82c9ab |
if ((flags & STATS_JSON_ZONES) != 0) {
|
|
|
82c9ab |
- result = dns_zt_apply(view->zonetable, true,
|
|
|
82c9ab |
- zone_jsonrender, za);
|
|
|
82c9ab |
+ result = dns_zt_apply(view->zonetable, isc_rwlocktype_read,
|
|
|
82c9ab |
+ true, zone_jsonrender, za);
|
|
|
82c9ab |
if (result != ISC_R_SUCCESS) {
|
|
|
82c9ab |
goto error;
|
|
|
82c9ab |
}
|
|
|
82c9ab |
diff --git a/lib/dns/include/dns/zt.h b/lib/dns/include/dns/zt.h
|
|
|
82c9ab |
index e658e5bb67..94212250da 100644
|
|
|
82c9ab |
--- a/lib/dns/include/dns/zt.h
|
|
|
82c9ab |
+++ b/lib/dns/include/dns/zt.h
|
|
|
82c9ab |
@@ -177,11 +177,11 @@ dns_zt_freezezones(dns_zt_t *zt, bool freeze);
|
|
|
82c9ab |
*/
|
|
|
82c9ab |
|
|
|
82c9ab |
isc_result_t
|
|
|
82c9ab |
-dns_zt_apply(dns_zt_t *zt, bool stop,
|
|
|
82c9ab |
+dns_zt_apply(dns_zt_t *zt, isc_rwlocktype_t lock, bool stop,
|
|
|
82c9ab |
isc_result_t (*action)(dns_zone_t *, void *), void *uap);
|
|
|
82c9ab |
|
|
|
82c9ab |
isc_result_t
|
|
|
82c9ab |
-dns_zt_apply2(dns_zt_t *zt, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
+dns_zt_apply2(dns_zt_t *zt, isc_rwlocktype_t lock, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
isc_result_t (*action)(dns_zone_t *, void *), void *uap);
|
|
|
82c9ab |
/*%<
|
|
|
82c9ab |
* Apply a given 'action' to all zone zones in the table.
|
|
|
82c9ab |
diff --git a/lib/dns/tests/zt_test.c b/lib/dns/tests/zt_test.c
|
|
|
82c9ab |
index 3f1e812d60..ee75303a50 100644
|
|
|
82c9ab |
--- a/lib/dns/tests/zt_test.c
|
|
|
82c9ab |
+++ b/lib/dns/tests/zt_test.c
|
|
|
82c9ab |
@@ -145,7 +145,8 @@ apply(void **state) {
|
|
|
82c9ab |
assert_non_null(view->zonetable);
|
|
|
82c9ab |
|
|
|
82c9ab |
assert_int_equal(nzones, 0);
|
|
|
82c9ab |
- result = dns_zt_apply(view->zonetable, false, count_zone, &nzones);
|
|
|
82c9ab |
+ result = dns_zt_apply2(view->zonetable, isc_rwlocktype_read, false, NULL,
|
|
|
82c9ab |
+ count_zone, &nzones);
|
|
|
82c9ab |
assert_int_equal(result, ISC_R_SUCCESS);
|
|
|
82c9ab |
assert_int_equal(nzones, 1);
|
|
|
82c9ab |
|
|
|
82c9ab |
diff --git a/lib/dns/view.c b/lib/dns/view.c
|
|
|
82c9ab |
index f01b4dea0f..bd1ced2863 100644
|
|
|
82c9ab |
--- a/lib/dns/view.c
|
|
|
82c9ab |
+++ b/lib/dns/view.c
|
|
|
82c9ab |
@@ -676,7 +676,8 @@ dns_view_dialup(dns_view_t *view) {
|
|
|
82c9ab |
REQUIRE(DNS_VIEW_VALID(view));
|
|
|
82c9ab |
REQUIRE(view->zonetable != NULL);
|
|
|
82c9ab |
|
|
|
82c9ab |
- (void)dns_zt_apply(view->zonetable, false, dialup, NULL);
|
|
|
82c9ab |
+ (void)dns_zt_apply2(view->zonetable, isc_rwlocktype_read, false, NULL,
|
|
|
82c9ab |
+ dialup, NULL);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
void
|
|
|
82c9ab |
diff --git a/lib/dns/zt.c b/lib/dns/zt.c
|
|
|
82c9ab |
index 3f12e247e0..af65740325 100644
|
|
|
82c9ab |
--- a/lib/dns/zt.c
|
|
|
82c9ab |
+++ b/lib/dns/zt.c
|
|
|
82c9ab |
@@ -202,7 +202,8 @@ flush(dns_zone_t *zone, void *uap) {
|
|
|
82c9ab |
static void
|
|
|
82c9ab |
zt_destroy(dns_zt_t *zt) {
|
|
|
82c9ab |
if (zt->flush) {
|
|
|
82c9ab |
- (void)dns_zt_apply(zt, false, flush, NULL);
|
|
|
82c9ab |
+ (void)dns_zt_apply(zt, isc_rwlocktype_none,
|
|
|
82c9ab |
+ false, flush, NULL);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
isc_refcount_destroy(&zt->references);
|
|
|
82c9ab |
dns_rbt_destroy(&zt->table);
|
|
|
82c9ab |
@@ -249,9 +250,7 @@ dns_zt_load(dns_zt_t *zt, bool stop) {
|
|
|
82c9ab |
|
|
|
82c9ab |
REQUIRE(VALID_ZT(zt));
|
|
|
82c9ab |
|
|
|
82c9ab |
- RWLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
- result = dns_zt_apply(zt, stop, load, NULL);
|
|
|
82c9ab |
- RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
+ result = dns_zt_apply2(zt, isc_rwlocktype_read, stop, NULL, load, NULL);
|
|
|
82c9ab |
return (result);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
@@ -293,7 +292,7 @@ dns_zt_asyncload2(dns_zt_t *zt, dns_zt_allloaded_t alldone, void *arg,
|
|
|
82c9ab |
* Prevent loads_pending going to zero while kicking off the loads.
|
|
|
82c9ab |
*/
|
|
|
82c9ab |
zt->loads_pending++;
|
|
|
82c9ab |
- result = dns_zt_apply2(zt, false, NULL, asyncload, ¶ms);
|
|
|
82c9ab |
+ result = dns_zt_apply2(zt, isc_rwlocktype_none, false, NULL, asyncload, ¶ms);
|
|
|
82c9ab |
pending = --zt->loads_pending;
|
|
|
82c9ab |
if (pending != 0) {
|
|
|
82c9ab |
zt->loaddone = alldone;
|
|
|
82c9ab |
@@ -342,9 +341,7 @@ dns_zt_loadnew(dns_zt_t *zt, bool stop) {
|
|
|
82c9ab |
|
|
|
82c9ab |
REQUIRE(VALID_ZT(zt));
|
|
|
82c9ab |
|
|
|
82c9ab |
- RWLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
- result = dns_zt_apply(zt, stop, loadnew, NULL);
|
|
|
82c9ab |
- RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
+ result = dns_zt_apply(zt, isc_rwlocktype_read, stop, loadnew, NULL);
|
|
|
82c9ab |
return (result);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
@@ -366,9 +363,7 @@ dns_zt_freezezones(dns_zt_t *zt, bool freeze) {
|
|
|
82c9ab |
|
|
|
82c9ab |
REQUIRE(VALID_ZT(zt));
|
|
|
82c9ab |
|
|
|
82c9ab |
- RWLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
- result = dns_zt_apply2(zt, false, &tresult, freezezones, &freeze);
|
|
|
82c9ab |
- RWUNLOCK(&zt->rwlock, isc_rwlocktype_read);
|
|
|
82c9ab |
+ result = dns_zt_apply2(zt, isc_rwlocktype_read, false, &tresult, freezezones, &freeze);
|
|
|
82c9ab |
if (tresult == ISC_R_NOTFOUND)
|
|
|
82c9ab |
tresult = ISC_R_SUCCESS;
|
|
|
82c9ab |
return ((result == ISC_R_SUCCESS) ? tresult : result);
|
|
|
82c9ab |
@@ -490,14 +485,14 @@ dns_zt_setviewrevert(dns_zt_t *zt) {
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
isc_result_t
|
|
|
82c9ab |
-dns_zt_apply(dns_zt_t *zt, bool stop,
|
|
|
82c9ab |
+dns_zt_apply(dns_zt_t *zt, isc_rwlocktype_t lock, bool stop,
|
|
|
82c9ab |
isc_result_t (*action)(dns_zone_t *, void *), void *uap)
|
|
|
82c9ab |
{
|
|
|
82c9ab |
- return (dns_zt_apply2(zt, stop, NULL, action, uap));
|
|
|
82c9ab |
+ return (dns_zt_apply2(zt, lock, stop, NULL, action, uap));
|
|
|
82c9ab |
}
|
|
|
82c9ab |
|
|
|
82c9ab |
isc_result_t
|
|
|
82c9ab |
-dns_zt_apply2(dns_zt_t *zt, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
+dns_zt_apply2(dns_zt_t *zt, isc_rwlocktype_t lock, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
isc_result_t (*action)(dns_zone_t *, void *), void *uap)
|
|
|
82c9ab |
{
|
|
|
82c9ab |
dns_rbtnode_t *node;
|
|
|
82c9ab |
@@ -508,6 +503,10 @@ dns_zt_apply2(dns_zt_t *zt, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
REQUIRE(VALID_ZT(zt));
|
|
|
82c9ab |
REQUIRE(action != NULL);
|
|
|
82c9ab |
|
|
|
82c9ab |
+ if (lock != isc_rwlocktype_none) {
|
|
|
82c9ab |
+ RWLOCK(&zt->rwlock, lock);
|
|
|
82c9ab |
+ }
|
|
|
82c9ab |
+
|
|
|
82c9ab |
dns_rbtnodechain_init(&chain, zt->mctx);
|
|
|
82c9ab |
result = dns_rbtnodechain_first(&chain, zt->table, NULL, NULL);
|
|
|
82c9ab |
if (result == ISC_R_NOTFOUND) {
|
|
|
82c9ab |
@@ -538,8 +537,13 @@ dns_zt_apply2(dns_zt_t *zt, bool stop, isc_result_t *sub,
|
|
|
82c9ab |
|
|
|
82c9ab |
cleanup:
|
|
|
82c9ab |
dns_rbtnodechain_invalidate(&chain);
|
|
|
82c9ab |
- if (sub != NULL)
|
|
|
82c9ab |
+ if (sub != NULL) {
|
|
|
82c9ab |
*sub = tresult;
|
|
|
82c9ab |
+ }
|
|
|
82c9ab |
+
|
|
|
82c9ab |
+ if (lock != isc_rwlocktype_none) {
|
|
|
82c9ab |
+ RWUNLOCK(&zt->rwlock, lock);
|
|
|
82c9ab |
+ }
|
|
|
82c9ab |
|
|
|
82c9ab |
return (result);
|
|
|
82c9ab |
}
|
|
|
82c9ab |
--
|
|
|
82c9ab |
2.37.2
|
|
|
82c9ab |
|