154 lines
7.6 KiB
Diff
154 lines
7.6 KiB
Diff
From 3ed7746ec92e69a9c37b4b34c6f0fce06b7ba592 Mon Sep 17 00:00:00 2001
|
|
From: Mark Andrews <marka@isc.org>
|
|
Date: Mon, 24 Aug 2020 11:44:09 +1000
|
|
Subject: [PATCH] Address lock-order-inversion
|
|
|
|
Obtain references to view->redirect and view->managed_keys then
|
|
release view->lock so dns_zone_setviewcommit and dns_zone_setviewrevert
|
|
can obtain the view->lock while holding zone->lock.
|
|
|
|
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=9132)
|
|
Cycle in lock order graph: M987831431424375936 (0x000000000000) => M1012319771577875480 (0x000000000000) => M987831431424375936
|
|
|
|
Mutex M1012319771577875480 acquired here while holding mutex M987831431424375936 in thread T2:
|
|
#0 pthread_mutex_lock <null> (named+0x4642a6)
|
|
#1 dns_zone_setviewcommit /builds/isc-projects/bind9/lib/dns/zone.c:1571:2 (libdns.so.1110+0x1d74eb)
|
|
#2 dns_view_setviewcommit /builds/isc-projects/bind9/lib/dns/view.c:2388:3 (libdns.so.1110+0x1cfe29)
|
|
#3 load_configuration /builds/isc-projects/bind9/bin/named/./server.c:8188:3 (named+0x51eadd)
|
|
#4 loadconfig /builds/isc-projects/bind9/bin/named/./server.c:9438:11 (named+0x510c66)
|
|
#5 ns_server_reconfigcommand /builds/isc-projects/bind9/bin/named/./server.c:9773:2 (named+0x510b41)
|
|
#6 ns_control_docommand /builds/isc-projects/bind9/bin/named/control.c:243:12 (named+0x4e451a)
|
|
#7 control_recvmessage /builds/isc-projects/bind9/bin/named/controlconf.c:465:13 (named+0x4e9056)
|
|
#8 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5)
|
|
#9 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729)
|
|
|
|
Mutex M987831431424375936 previously acquired by the same thread here:
|
|
#0 pthread_mutex_lock <null> (named+0x4642a6)
|
|
#1 dns_view_setviewcommit /builds/isc-projects/bind9/lib/dns/view.c:2382:2 (libdns.so.1110+0x1cfde7)
|
|
#2 load_configuration /builds/isc-projects/bind9/bin/named/./server.c:8188:3 (named+0x51eadd)
|
|
#3 loadconfig /builds/isc-projects/bind9/bin/named/./server.c:9438:11 (named+0x510c66)
|
|
#4 ns_server_reconfigcommand /builds/isc-projects/bind9/bin/named/./server.c:9773:2 (named+0x510b41)
|
|
#5 ns_control_docommand /builds/isc-projects/bind9/bin/named/control.c:243:12 (named+0x4e451a)
|
|
#6 control_recvmessage /builds/isc-projects/bind9/bin/named/controlconf.c:465:13 (named+0x4e9056)
|
|
#7 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5)
|
|
#8 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729)
|
|
|
|
Mutex M987831431424375936 acquired here while holding mutex M1012319771577875480 in thread T7:
|
|
#0 pthread_mutex_lock <null> (named+0x4642a6)
|
|
#1 dns_view_findzonecut2 /builds/isc-projects/bind9/lib/dns/view.c:1300:2 (libdns.so.1110+0x1cc93a)
|
|
#2 dns_view_findzonecut /builds/isc-projects/bind9/lib/dns/view.c:1261:9 (libdns.so.1110+0x1cc864)
|
|
#3 fctx_create /builds/isc-projects/bind9/lib/dns/resolver.c:4459:13 (libdns.so.1110+0x1779d3)
|
|
#4 dns_resolver_createfetch3 /builds/isc-projects/bind9/lib/dns/resolver.c:9628:12 (libdns.so.1110+0x176cb6)
|
|
#5 dns_resolver_createfetch /builds/isc-projects/bind9/lib/dns/resolver.c:9504:10 (libdns.so.1110+0x174e17)
|
|
#6 zone_refreshkeys /builds/isc-projects/bind9/lib/dns/zone.c:10061:12 (libdns.so.1110+0x2055a5)
|
|
#7 zone_maintenance /builds/isc-projects/bind9/lib/dns/zone.c:10274:5 (libdns.so.1110+0x203a78)
|
|
#8 zone_timer /builds/isc-projects/bind9/lib/dns/zone.c:13106:2 (libdns.so.1110+0x1e815a)
|
|
#9 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5)
|
|
#10 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729)
|
|
|
|
Mutex M1012319771577875480 previously acquired by the same thread here:
|
|
#0 pthread_mutex_lock <null> (named+0x4642a6)
|
|
#1 zone_refreshkeys /builds/isc-projects/bind9/lib/dns/zone.c:9951:2 (libdns.so.1110+0x204dc3)
|
|
#2 zone_maintenance /builds/isc-projects/bind9/lib/dns/zone.c:10274:5 (libdns.so.1110+0x203a78)
|
|
#3 zone_timer /builds/isc-projects/bind9/lib/dns/zone.c:13106:2 (libdns.so.1110+0x1e815a)
|
|
#4 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5)
|
|
#5 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729)
|
|
|
|
Thread T2 'isc-worker0001' (tid=9163, running) created by main thread at:
|
|
#0 pthread_create <null> (named+0x446edb)
|
|
#1 isc_thread_create /builds/isc-projects/bind9/lib/isc/pthreads/thread.c:60:8 (libisc.so.1107+0x726d8)
|
|
#2 isc__taskmgr_create /builds/isc-projects/bind9/lib/isc/task.c:1468:7 (libisc.so.1107+0x4d635)
|
|
#3 isc_taskmgr_create /builds/isc-projects/bind9/lib/isc/task.c:2109:11 (libisc.so.1107+0x4f587)
|
|
#4 create_managers /builds/isc-projects/bind9/bin/named/./main.c:886:11 (named+0x4f1a97)
|
|
#5 setup /builds/isc-projects/bind9/bin/named/./main.c:1305:11 (named+0x4f05ee)
|
|
#6 main /builds/isc-projects/bind9/bin/named/./main.c:1556:2 (named+0x4ef12d)
|
|
|
|
Thread T7 'isc-worker0006' (tid=9168, running) created by main thread at:
|
|
#0 pthread_create <null> (named+0x446edb)
|
|
#1 isc_thread_create /builds/isc-projects/bind9/lib/isc/pthreads/thread.c:60:8 (libisc.so.1107+0x726d8)
|
|
#2 isc__taskmgr_create /builds/isc-projects/bind9/lib/isc/task.c:1468:7 (libisc.so.1107+0x4d635)
|
|
#3 isc_taskmgr_create /builds/isc-projects/bind9/lib/isc/task.c:2109:11 (libisc.so.1107+0x4f587)
|
|
#4 create_managers /builds/isc-projects/bind9/bin/named/./main.c:886:11 (named+0x4f1a97)
|
|
#5 setup /builds/isc-projects/bind9/bin/named/./main.c:1305:11 (named+0x4f05ee)
|
|
#6 main /builds/isc-projects/bind9/bin/named/./main.c:1556:2 (named+0x4ef12d)
|
|
|
|
SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) (/builds/isc-projects/bind9/bin/named/.libs/named+0x4642a6) in pthread_mutex_lock
|
|
Conflict: NA
|
|
Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/3ed7746ec92e69a9c37b4b34c6f0fce06b7ba592
|
|
---
|
|
lib/dns/view.c | 28 ++++++++++++++++++++++++----
|
|
1 file changed, 24 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/lib/dns/view.c b/lib/dns/view.c
|
|
index 006f99794d..0a5559ac9d 100644
|
|
--- a/lib/dns/view.c
|
|
+++ b/lib/dns/view.c
|
|
@@ -2377,25 +2377,37 @@ dns_view_loadnta(dns_view_t *view) {
|
|
|
|
void
|
|
dns_view_setviewcommit(dns_view_t *view) {
|
|
+ dns_zone_t *redirect = NULL, *managed_keys = NULL;
|
|
+
|
|
REQUIRE(DNS_VIEW_VALID(view));
|
|
|
|
LOCK(&view->lock);
|
|
|
|
if (view->redirect != NULL) {
|
|
- dns_zone_setviewcommit(view->redirect);
|
|
+ dns_zone_attach(view->redirect, &redirect);
|
|
}
|
|
if (view->managed_keys != NULL) {
|
|
- dns_zone_setviewcommit(view->managed_keys);
|
|
+ dns_zone_attach(view->managed_keys, &managed_keys);
|
|
}
|
|
if (view->zonetable != NULL) {
|
|
dns_zt_setviewcommit(view->zonetable);
|
|
}
|
|
|
|
UNLOCK(&view->lock);
|
|
+
|
|
+ if (redirect != NULL) {
|
|
+ dns_zone_setviewcommit(redirect);
|
|
+ dns_zone_detach(&redirect);
|
|
+ }
|
|
+ if (managed_keys != NULL) {
|
|
+ dns_zone_setviewcommit(managed_keys);
|
|
+ dns_zone_detach(&managed_keys);
|
|
+ }
|
|
}
|
|
|
|
void
|
|
dns_view_setviewrevert(dns_view_t *view) {
|
|
+ dns_zone_t *redirect = NULL, *managed_keys = NULL;
|
|
dns_zt_t *zonetable;
|
|
|
|
REQUIRE(DNS_VIEW_VALID(view));
|
|
@@ -2406,14 +2418,22 @@ dns_view_setviewrevert(dns_view_t *view) {
|
|
*/
|
|
LOCK(&view->lock);
|
|
if (view->redirect != NULL) {
|
|
- dns_zone_setviewrevert(view->redirect);
|
|
+ dns_zone_attach(view->redirect, &redirect);
|
|
}
|
|
if (view->managed_keys != NULL) {
|
|
- dns_zone_setviewrevert(view->managed_keys);
|
|
+ dns_zone_attach(view->managed_keys, &managed_keys);
|
|
}
|
|
zonetable = view->zonetable;
|
|
UNLOCK(&view->lock);
|
|
|
|
+ if (redirect != NULL) {
|
|
+ dns_zone_setviewrevert(redirect);
|
|
+ dns_zone_detach(&redirect);
|
|
+ }
|
|
+ if (managed_keys != NULL) {
|
|
+ dns_zone_setviewrevert(managed_keys);
|
|
+ dns_zone_detach(&managed_keys);
|
|
+ }
|
|
if (zonetable != NULL) {
|
|
dns_zt_setviewrevert(zonetable);
|
|
}
|
|
--
|
|
2.23.0
|
|
|