From 505e3381564294e6b8c7a0f69883e7d4aab0efe8 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Mon, 24 Aug 2020 13:35:41 +1000 Subject: [PATCH] Address lock-order-inversion WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=12714) Cycle in lock order graph: M100252 (0x7b7c00010a08) => M1171 (0x7b7400000dc8) => M100252 Mutex M1171 acquired here while holding mutex M100252 in thread T1: #0 pthread_mutex_lock (delv+0x4483a6) #1 dns_resolver_createfetch3 /builds/isc-projects/bind9/lib/dns/resolver.c:9585:2 (libdns.so.1110+0x1769fd) #2 dns_resolver_createfetch /builds/isc-projects/bind9/lib/dns/resolver.c:9504:10 (libdns.so.1110+0x174e17) #3 create_fetch /builds/isc-projects/bind9/lib/dns/validator.c:1156:10 (libdns.so.1110+0x1c1e5f) #4 validatezonekey /builds/isc-projects/bind9/lib/dns/validator.c:2124:13 (libdns.so.1110+0x1c3b6d) #5 start_positive_validation /builds/isc-projects/bind9/lib/dns/validator.c:2301:10 (libdns.so.1110+0x1bfde9) #6 validator_start /builds/isc-projects/bind9/lib/dns/validator.c:3647:12 (libdns.so.1110+0x1bef62) #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 M100252 previously acquired by the same thread here: #0 pthread_mutex_lock (delv+0x4483a6) #1 validator_start /builds/isc-projects/bind9/lib/dns/validator.c:3628:2 (libdns.so.1110+0x1bee31) #2 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5) #3 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729) Mutex M100252 acquired here while holding mutex M1171 in thread T1: #0 pthread_mutex_lock (delv+0x4483a6) #1 dns_validator_destroy /builds/isc-projects/bind9/lib/dns/validator.c:3912:2 (libdns.so.1110+0x1bf788) #2 validated /builds/isc-projects/bind9/lib/dns/resolver.c:4916:2 (libdns.so.1110+0x18fdfd) #3 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5) #4 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729) Mutex M1171 previously acquired by the same thread here: #0 pthread_mutex_lock (delv+0x4483a6) #1 validated /builds/isc-projects/bind9/lib/dns/resolver.c:4907:2 (libdns.so.1110+0x18fc3d) #2 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x507d5) #3 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d729) Thread T1 'isc-worker0000' (tid=12729, running) created by main thread at: #0 pthread_create (delv+0x42afdb) #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_createinctx /builds/isc-projects/bind9/lib/isc/task.c:2091:11 (libisc.so.1107+0x4f4ac) #4 main /builds/isc-projects/bind9/bin/delv/delv.c:1639:2 (delv+0x4b7f96) SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) (/builds/isc-projects/bind9/bin/delv/.libs/delv+0x4483a6) in pthread_mutex_lock Conflict: NA Reference: https://gitlab.isc.org/isc-projects/bind9/-/commit/505e3381564294e6b8c7a0f69883e7d4aab0efe8 --- lib/dns/resolver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 1146f2c62f..cf6c00100c 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -4908,6 +4908,7 @@ validated(isc_task_t *task, isc_event_t *event) { ISC_LIST_UNLINK(fctx->validators, vevent->validator, link); fctx->validator = NULL; + UNLOCK(&res->buckets[bucketnum].lock); /* * Destroy the validator early so that we can @@ -4918,6 +4919,7 @@ validated(isc_task_t *task, isc_event_t *event) { negative = (vevent->rdataset == NULL); + LOCK(&res->buckets[bucketnum].lock); sentresponse = ((fctx->options & DNS_FETCHOPT_NOVALIDATE) != 0); /* -- 2.23.0