]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
rbtdb: cleanup_dead_nodes should ignore alive nodes on the deadlist
authorWitold Kręcicki <wpk@isc.org>
Tue, 30 Jun 2020 12:24:12 +0000 (14:24 +0200)
committerOndřej Surý <ondrej@isc.org>
Wed, 1 Jul 2020 13:11:07 +0000 (15:11 +0200)
lib/dns/rbtdb.c

index 87fbdb317b93bb33be021d880e7a042eaa9ccc59..c0b3479684137f557f6888504608f843be8d378e 100644 (file)
@@ -1914,15 +1914,16 @@ cleanup_dead_nodes(dns_rbtdb_t *rbtdb, int bucketnum) {
                ISC_LIST_UNLINK(rbtdb->deadnodes[bucketnum], node, deadlink);
 
                /*
-                * Since we're holding a tree write lock, it should be
-                * impossible for this node to be referenced by others.
-                *
-                * decrement_reference may not have tested node->down, as
-                * the tree_lock was not held, before adding the node to
-                * deadnodes so we test it here.
+                * We might have reactivated this node without a tree write
+                * lock, so we couldn't remove this node from deadnodes then
+                * and we have to do it now.
                 */
-               INSIST(isc_refcount_current(&node->references) == 0 &&
-                      node->data == NULL);
+               if (isc_refcount_current(&node->references) != 0 ||
+                   node->data != NULL) {
+                       node = ISC_LIST_HEAD(rbtdb->deadnodes[bucketnum]);
+                       count--;
+                       continue;
+               }
 
                if (is_leaf(node) && rbtdb->task != NULL) {
                        send_to_prune_tree(rbtdb, node, isc_rwlocktype_write);