From 508bb0859c1d489e45d89e0118cb26d64ed1abc6 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 15:23:13 +1000 Subject: [PATCH] Pause dbiterator to release rwlock to prevent lock-order-inversion. WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) Cycle in lock order graph: M1 (0x000000000000) => M2 (0x000000000000) => M1 Mutex M2 acquired here while holding mutex M1 in thread T1: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 getsigningtime lib/dns/rbtdb.c:8198:2 #3 dns_db_getsigningtime lib/dns/db.c:979:11 #4 set_resigntime lib/dns/zone.c:3887:11 #5 dns_zone_markdirty lib/dns/zone.c:11115:4 #6 update_action lib/ns/update.c:3376:3 #7 dispatch lib/isc/task.c:1152:7 #8 run lib/isc/task.c:1344:2 Mutex M1 previously acquired by the same thread here: #0 pthread_mutex_lock #1 dns_zone_markdirty lib/dns/zone.c:11085:2 #2 update_action lib/ns/update.c:3376:3 #3 dispatch lib/isc/task.c:1152:7 #4 run lib/isc/task.c:1344:2 Mutex M1 acquired here while holding mutex M2 in thread T2: #0 pthread_mutex_lock #1 zone_nsec3chain lib/dns/zone.c:8274:3 #2 zone_maintenance lib/dns/zone.c:11052:4 #3 zone_timer lib/dns/zone.c:14087:2 #4 dispatch lib/isc/task.c:1152:7 #5 run lib/isc/task.c:1344:2 Mutex M2 previously acquired by the same thread here: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 resume_iteration lib/dns/rbtdb.c:9357:2 #3 dbiterator_next lib/dns/rbtdb.c:9647:3 #4 dns_dbiterator_next lib/dns/dbiterator.c:87:10 #5 zone_nsec3chain lib/dns/zone.c:8412:13 #6 zone_maintenance lib/dns/zone.c:11052:4 #7 zone_timer lib/dns/zone.c:14087:2 #8 dispatch lib/isc/task.c:1152:7 #9 run lib/isc/task.c:1344:2 Thread T1 (running) created by main thread at: #0 pthread_create #1 isc_thread_create lib/isc/pthreads/thread.c:73:8 #2 isc_taskmgr_create lib/isc/task.c:1434:3 #3 create_managers bin/named/main.c:915:11 #4 setup bin/named/main.c:1223:11 #5 main bin/named/main.c:1523:2 Thread T2 (running) created by main thread at: #0 pthread_create #1 isc_thread_create lib/isc/pthreads/thread.c:73:8 #2 isc_taskmgr_create lib/isc/task.c:1434:3 #3 create_managers bin/named/main.c:915:11 #4 setup bin/named/main.c:1223:11 #5 main bin/named/main.c:1523:2 SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) in pthread_rwlock_rdlock (cherry picked from commit 98025e15d0ea05bdac55fb4aa8e342bdf6febe1a) Conflict: NA Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/508bb0859c1d489e45d89e0118cb26d64ed1abc6 --- lib/dns/zone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 257f26780c..55eb1d72ec 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -7722,6 +7722,8 @@ zone_nsec3chain(dns_zone_t *zone) { * generated by dns__zone_updatesigs() calls later in this function. */ while (nsec3chain != NULL && nodes-- > 0 && signatures > 0) { + dns_dbiterator_pause(nsec3chain->dbiterator); + LOCK_ZONE(zone); nextnsec3chain = ISC_LIST_NEXT(nsec3chain, link); -- 2.23.0