]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Inactive incorrectly incremented
authorMark Andrews <marka@isc.org>
Fri, 18 Dec 2020 02:31:07 +0000 (13:31 +1100)
committerMark Andrews <marka@isc.org>
Wed, 6 Jan 2021 08:18:54 +0000 (19:18 +1100)
It is possible to have two threads destroying an rbtdb at the same
time when detachnode() executes and removes the last reference to
a node between exiting being set to true for the node and testing
if the references are zero in maybe_free_rbtdb().  Move NODE_UNLOCK()
to after checking if references is zero to prevent detachnode()
changing the reference count too early.

(cherry picked from commit 859d2fdad6d1c6ff20083a4c463a929cbeb26438)

lib/dns/rbtdb.c

index c60117c5eeb6e390337017da97196ae76a8d08b8..34fc404b2ed0c60424ab9de08b23520449d1ee0b 100644 (file)
@@ -1453,11 +1453,11 @@ maybe_free_rbtdb(dns_rbtdb_t *rbtdb) {
        for (i = 0; i < rbtdb->node_lock_count; i++) {
                NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
                rbtdb->node_locks[i].exiting = true;
-               NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
                if (isc_refcount_current(&rbtdb->node_locks[i].references)
                    == 0) {
                        inactive++;
                }
+               NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
        }
 
        if (inactive != 0) {