]> 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:37:01 +0000 (15:37 +0200)
(cherry picked from commit c8f2d55acf79678801bff0786049451b595563b2)

lib/dns/rbtdb.c

index d7fec5a762504b9ff4c52ba923772d66b2999dc9..baf764174a494296f5d6f15363ca94834b3ce5d4 100644 (file)
@@ -2151,15 +2151,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(dns_rbtnode_refcurrent(node) == 0 &&
-                      node->data == NULL);
+               if (dns_rbtnode_refcurrent(node) != 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);