From 9e5f83c4993310f9841a4eba90d4a84dba882727 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 12:50:42 +1000 Subject: [PATCH 1/7] Address lock-order-inversion between the keytable and the db locks. 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 dns_keytable_find lib/dns/keytable.c:522:2 #3 sync_keyzone lib/dns/zone.c:4560:12 #4 dns_zone_synckeyzone lib/dns/zone.c:4635:11 #5 mkey_refresh bin/named/server.c:15423:2 #6 named_server_mkeys bin/named/server.c:15727:4 #7 named_control_docommand bin/named/control.c:236:12 #8 control_command bin/named/controlconf.c:365:17 #9 dispatch lib/isc/task.c:1152:7 #10 run lib/isc/task.c:1344:2 Mutex M1 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_first lib/dns/rbtdb.c:9407:3 #4 dns_dbiterator_first lib/dns/dbiterator.c:43:10 #5 dns_rriterator_first lib/dns/rriterator.c:71:15 #6 sync_keyzone lib/dns/zone.c:4543:16 #7 dns_zone_synckeyzone lib/dns/zone.c:4635:11 #8 mkey_refresh bin/named/server.c:15423:2 #9 named_server_mkeys bin/named/server.c:15727:4 #10 named_control_docommand bin/named/control.c:236:12 #11 control_command bin/named/controlconf.c:365:17 #12 dispatch lib/isc/task.c:1152:7 #13 run lib/isc/task.c:1344:2 Mutex M1 acquired here while holding mutex M2 in thread T1: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 zone_find lib/dns/rbtdb.c:4029:2 #3 dns_db_find lib/dns/db.c:500:11 #4 addifmissing lib/dns/zone.c:4481:11 #5 dns_keytable_forall lib/dns/keytable.c:786:4 #6 sync_keyzone lib/dns/zone.c:4586:2 #7 dns_zone_synckeyzone lib/dns/zone.c:4635:11 #8 mkey_refresh bin/named/server.c:15423:2 #9 named_server_mkeys bin/named/server.c:15727:4 #10 named_control_docommand bin/named/control.c:236:12 #11 control_command bin/named/controlconf.c:365:17 #12 dispatch lib/isc/task.c:1152:7 #13 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 dns_keytable_forall lib/dns/keytable.c:770:2 #3 sync_keyzone lib/dns/zone.c:4586:2 #4 dns_zone_synckeyzone lib/dns/zone.c:4635:11 #5 mkey_refresh bin/named/server.c:15423:2 #6 named_server_mkeys bin/named/server.c:15727:4 #7 named_control_docommand bin/named/control.c:236:12 #8 control_command bin/named/controlconf.c:365:17 #9 dispatch lib/isc/task.c:1152:7 #10 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 SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) in pthread_rwlock_rdlock --- lib/dns/zone.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 1cac1de400..f2c62b4bda 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -4556,7 +4556,11 @@ sync_keyzone(dns_zone_t *zone, dns_db_t *db) { if (rdataset->type != dns_rdatatype_keydata) { continue; } - + /* + * Release db wrlock to prevent LOR reports against + * dns_keytable_forall() call below. + */ + dns_rriterator_pause(&rrit); result = dns_keytable_find(sr, rrname, &keynode); if (result != ISC_R_SUCCESS || !dns_keynode_managed(keynode)) { CHECK(delete_keydata(db, ver, &diff, rrname, rdataset)); From e185e37137729c6e377e65d8744c49aef843046f Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 14:18:17 +1000 Subject: [PATCH 2/7] Pause dbiterator to release rwlock to prevent lock-order-inversion. WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) Cycle in lock order graph: M1 (0x000000000001) => M2 (0x000000000002) => M3 (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 findnodeintree lib/dns/rbtdb.c:2877:2 #3 findnode lib/dns/rbtdb.c:2941:10 #4 dns_db_findnode lib/dns/db.c:439:11 #5 copy_non_dnssec_records lib/dns/zone.c:16031:11 #6 receive_secure_db lib/dns/zone.c:16163:12 #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_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 resume_iteration lib/dns/rbtdb.c:9357:2 #3 dbiterator_first lib/dns/rbtdb.c:9407:3 #4 dns_dbiterator_first lib/dns/dbiterator.c:43:10 #5 receive_secure_db lib/dns/zone.c:16160:16 #6 dispatch lib/isc/task.c:1152:7 #7 run lib/isc/task.c:1344:2 Mutex M3 acquired here while holding mutex M2 in thread T2: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 zone_sign lib/dns/zone.c:9244:3 #3 zone_maintenance lib/dns/zone.c:11044:4 #4 zone_timer lib/dns/zone.c:14087:2 #5 dispatch lib/isc/task.c:1152:7 #6 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_sign lib/dns/zone.c:9485:13 #6 zone_maintenance lib/dns/zone.c:11044: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 Mutex M1 acquired here while holding mutex M3 in thread T3: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 findnodeintree lib/dns/rbtdb.c:2877:2 #3 findnode lib/dns/rbtdb.c:2941:10 #4 dns_db_findnode lib/dns/db.c:439:11 #5 zone_get_from_db lib/dns/zone.c:5602:11 #6 get_raw_serial lib/dns/zone.c:2520:12 #7 zone_gotwritehandle lib/dns/zone.c:2559:4 #8 dispatch lib/isc/task.c:1152:7 #9 run lib/isc/task.c:1344:2 Mutex M3 previously acquired by the same thread here: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 zone_gotwritehandle lib/dns/zone.c:2552:2 #3 dispatch lib/isc/task.c:1152:7 #4 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 Thread T3 (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 --- lib/dns/zone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index f2c62b4bda..0cbb5369ee 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -16028,6 +16028,8 @@ copy_non_dnssec_records(dns_zone_t *zone, dns_db_t *db, dns_db_t *version, return (ISC_R_SUCCESS); } + dns_dbiterator_pause(dbiterator); + result = dns_db_findnode(db, name, true, &node); if (result != ISC_R_SUCCESS) { goto cleanup; From 98025e15d0ea05bdac55fb4aa8e342bdf6febe1a Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 15:23:13 +1000 Subject: [PATCH 3/7] 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 --- lib/dns/zone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 0cbb5369ee..806ffb0a49 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -8271,6 +8271,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); From c9dbad97b2f96fcfba3290fe52f6b044af64d780 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 16:07:57 +1000 Subject: [PATCH 4/7] Pause dbiterator to release rwlock to prevent lock-order-inversion. WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) Cycle in lock order graph: M1 (0x000000000001) => 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 zone_sign lib/dns/zone.c:9247:3 #3 zone_maintenance lib/dns/zone.c:11047:4 #4 zone_timer lib/dns/zone.c:14090:2 #5 dispatch lib/isc/task.c:1152:7 #6 run lib/isc/task.c:1344:2 Mutex M1 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_sign lib/dns/zone.c:9488:13 #6 zone_maintenance lib/dns/zone.c:11047:4 #7 zone_timer lib/dns/zone.c:14090:2 #8 dispatch lib/isc/task.c:1152:7 #9 run lib/isc/task.c:1344:2 Mutex M1 acquired here while holding mutex M2 in thread T2: #0 pthread_rwlock_rdlock #1 isc_rwlock_lock lib/isc/rwlock.c:48:3 #2 findnodeintree lib/dns/rbtdb.c:2877:2 #3 findnode lib/dns/rbtdb.c:2941:10 #4 dns_db_findnode lib/dns/db.c:439:11 #5 dns_db_getsoaserial lib/dns/db.c:780:11 #6 dump_done lib/dns/zone.c:11428:15 #7 dump_quantum lib/dns/masterdump.c:1487:2 #8 dispatch lib/isc/task.c:1152:7 #9 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 dump_done lib/dns/zone.c:11426:4 #3 dump_quantum lib/dns/masterdump.c:1487:2 #4 dispatch lib/isc/task.c:1152:7 #5 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 --- lib/dns/zone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 806ffb0a49..a99becef16 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -9241,6 +9241,8 @@ zone_sign(dns_zone_t *zone) { while (signing != NULL && nodes-- > 0 && signatures > 0) { bool has_alg = false; + + dns_dbiterator_pause(signing->dbiterator); nextsigning = ISC_LIST_NEXT(signing, link); ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read); From fbed96220486a063aafdd0a6ada8adce972fd48f Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 4 Sep 2020 16:40:51 +1000 Subject: [PATCH 5/7] 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 (0x000000000001) => 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:11119: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:11089: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 T1: #0 pthread_mutex_lock #1 zone_nsec3chain lib/dns/zone.c:8502:3 #2 zone_maintenance lib/dns/zone.c:11056:4 #3 zone_timer lib/dns/zone.c:14091: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_current lib/dns/rbtdb.c:9695:3 #4 dns_dbiterator_current lib/dns/dbiterator.c:101:10 #5 zone_nsec3chain lib/dns/zone.c:8539:3 #6 zone_maintenance lib/dns/zone.c:11056:4 #7 zone_timer lib/dns/zone.c:14091: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 SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) in pthread_rwlock_rdlock --- lib/dns/zone.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index a99becef16..11d074c571 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -8499,6 +8499,8 @@ zone_nsec3chain(dns_zone_t *zone) { first = true; buildnsecchain = false; while (nsec3chain != NULL && nodes-- > 0 && signatures > 0) { + dns_dbiterator_pause(nsec3chain->dbiterator); + LOCK_ZONE(zone); nextnsec3chain = ISC_LIST_NEXT(nsec3chain, link); UNLOCK_ZONE(zone); From 2e63de94aa902fd923abfde3461e6a03532afbe5 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 8 Sep 2020 13:16:28 +1000 Subject: [PATCH 6/7] Pause the database iterator to release rwlock --- lib/dns/zone.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 11d074c571..0d4259c750 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -8539,6 +8539,7 @@ zone_nsec3chain(dns_zone_t *zone) { } dns_dbiterator_current(nsec3chain->dbiterator, &node, name); + dns_dbiterator_pause(nsec3chain->dbiterator); delegation = false; if (!buildnsecchain) { @@ -10730,6 +10731,7 @@ zone_refreshkeys(dns_zone_t *zone) { /* Removal timer expired? */ if (kd.removehd != 0 && kd.removehd < now) { + dns_rriterator_pause(&rrit); CHECK(update_one_rr(db, ver, &diff, DNS_DIFFOP_DEL, name, ttl, &rdata)); @@ -10746,6 +10748,7 @@ zone_refreshkeys(dns_zone_t *zone) { timer = kd.refresh; } + dns_rriterator_pause(&rrit); set_refreshkeytimer(zone, &kd, now, false); timerset = true; } @@ -10754,6 +10757,8 @@ zone_refreshkeys(dns_zone_t *zone) { continue; } + dns_rriterator_pause(&rrit); + kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t)); zone->refreshkeycount++; From 9e584a45114849637c0ab04e9410ba5fc00b054d Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 8 Sep 2020 13:42:07 +1000 Subject: [PATCH 7/7] Pause dbiterator ealier 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 findnodeintree lib/dns/rbtdb.c:2877:2 #3 findnode lib/dns/rbtdb.c:2941:10 #4 dns_db_findnode lib/dns/db.c:439:11 #5 resume_addnsec3chain lib/dns/zone.c:3776:11 #6 rss_post lib/dns/zone.c:20659:3 #7 setnsec3param lib/dns/zone.c:20471:3 #8 dispatch lib/isc/task.c:1152:7 #9 run lib/isc/task.c:1344:2 Mutex M1 previously acquired by the same thread here: #0 pthread_mutex_lock #1 rss_post lib/dns/zone.c:20658:3 #2 setnsec3param lib/dns/zone.c:20471: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:8666:5 #2 zone_maintenance lib/dns/zone.c:11063:4 #3 zone_timer lib/dns/zone.c:14098: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:8656:13 #6 zone_maintenance lib/dns/zone.c:11063:4 #7 zone_timer lib/dns/zone.c:14098:2 #8 dispatch lib/isc/task.c:1152:7 #9 run lib/isc/task.c:1344:2 --- lib/dns/zone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 0d4259c750..eb300e1bfc 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -8663,12 +8663,12 @@ zone_nsec3chain(dns_zone_t *zone) { goto same_removechain; } if (result == ISC_R_NOMORE) { + dns_dbiterator_pause(nsec3chain->dbiterator); LOCK_ZONE(zone); ISC_LIST_UNLINK(zone->nsec3chain, nsec3chain, link); UNLOCK_ZONE(zone); ISC_LIST_APPEND(cleanup, nsec3chain, link); - dns_dbiterator_pause(nsec3chain->dbiterator); result = fixup_nsec3param( db, version, nsec3chain, false, privatetype, ¶m_diff);