Blame SOURCES/bind-9.11-rh1935152.patch

814232
From 4757898440d52b0adbf7ec7ee7f0f89b61aac0fb Mon Sep 17 00:00:00 2001
814232
From: Mark Andrews <marka@isc.org>
814232
Date: Fri, 18 Dec 2020 13:31:07 +1100
814232
Subject: [PATCH] Inactive incorrectly incremented
814232
814232
It is possible to have two threads destroying an rbtdb at the same
814232
time when detachnode() executes and removes the last reference to
814232
a node between exiting being set to true for the node and testing
814232
if the references are zero in maybe_free_rbtdb().  Move NODE_UNLOCK()
814232
to after checking if references is zero to prevent detachnode()
814232
changing the reference count too early.
814232
814232
(cherry picked from commit 859d2fdad6d1c6ff20083a4c463a929cbeb26438)
814232
(cherry picked from commit 25150c15e7cfa73289f04470e2e699ebb7c28fef)
814232
---
814232
 lib/dns/rbtdb.c | 2 +-
814232
 1 file changed, 1 insertion(+), 1 deletion(-)
814232
814232
diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c
814232
index 8ea4d47..77ef7a4 100644
814232
--- a/lib/dns/rbtdb.c
814232
+++ b/lib/dns/rbtdb.c
814232
@@ -1460,11 +1460,11 @@ maybe_free_rbtdb(dns_rbtdb_t *rbtdb) {
814232
 	for (i = 0; i < rbtdb->node_lock_count; i++) {
814232
 		NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
814232
 		rbtdb->node_locks[i].exiting = true;
814232
-		NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
814232
 		if (isc_refcount_current(&rbtdb->node_locks[i].references)
814232
 		    == 0) {
814232
 			inactive++;
814232
 		}
814232
+		NODE_UNLOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_write);
814232
 	}
814232
 
814232
 	if (inactive != 0) {
814232
-- 
814232
2.26.3
814232