]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Pause dbiterator ealier to prevent lock-order-inversion
authorMark Andrews <marka@isc.org>
Tue, 8 Sep 2020 03:42:07 +0000 (13:42 +1000)
committerMark Andrews <marka@isc.org>
Thu, 17 Sep 2020 08:27:14 +0000 (18:27 +1000)
    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 <null>
    #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 <null>
    #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 <null>
    #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 <null>
    #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

(cherry picked from commit 9e584a45114849637c0ab04e9410ba5fc00b054d)

lib/dns/zone.c

index a81733f828c5edf26a1a6480bea2a25f7ae16848..096ff82f34bb82126b4d42dbd994b4951f87ef5e 100644 (file)
@@ -8093,12 +8093,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,