Tomas Hozza 2a39e7
commit 3a2ea636103eaf40404fb82f228605d384c36434
Tomas Hozza 2a39e7
Author: Mark Andrews <marka@isc.org>
Tomas Hozza 2a39e7
Date:   Tue Dec 17 09:08:59 2013 +1100
Tomas Hozza 2a39e7
Tomas Hozza 2a39e7
    3692.   [bug]           Two calls to dns_db_getoriginnode were fatal if there
Tomas Hozza 2a39e7
                            was no data at the node. [RT #35080]
Tomas Hozza 2a39e7
    
Tomas Hozza 2a39e7
    (cherry picked from commit 161e803a5608956271d8120be37a1b383d14b647)
Tomas Hozza 2a39e7
Tomas Hozza 2a39e7
diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c
Tomas Hozza 2a39e7
index 2dd4aa0..941b77e 100644
Tomas Hozza 2a39e7
--- a/lib/dns/rbtdb.c
Tomas Hozza 2a39e7
+++ b/lib/dns/rbtdb.c
Tomas Hozza 2a39e7
@@ -1638,8 +1638,11 @@ decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
Tomas Hozza 2a39e7
 
Tomas Hozza 2a39e7
 	nodelock = &rbtdb->node_locks[bucket];
Tomas Hozza 2a39e7
 
Tomas Hozza 2a39e7
+#define KEEP_NODE(n, r) \
Tomas Hozza 2a39e7
+	((n)->data != NULL || (n)->down != NULL || (n) == (r)->origin_node)
Tomas Hozza 2a39e7
+
Tomas Hozza 2a39e7
 	/* Handle easy and typical case first. */
Tomas Hozza 2a39e7
-	if (!node->dirty && (node->data != NULL || node->down != NULL)) {
Tomas Hozza 2a39e7
+	if (!node->dirty && KEEP_NODE(node, rbtdb)) {
Tomas Hozza 2a39e7
 		dns_rbtnode_refdecrement(node, &nrefs);
Tomas Hozza 2a39e7
 		INSIST((int)nrefs >= 0);
Tomas Hozza 2a39e7
 		if (nrefs == 0) {
Tomas Hozza 2a39e7
@@ -1708,12 +1711,11 @@ decrement_reference(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
Tomas Hozza 2a39e7
 	isc_refcount_decrement(&nodelock->references, &refs);
Tomas Hozza 2a39e7
 	INSIST((int)refs >= 0);
Tomas Hozza 2a39e7
 
Tomas Hozza 2a39e7
-	/*
Tomas Hozza 2a39e7
-	 * XXXDCL should this only be done for cache zones?
Tomas Hozza 2a39e7
-	 */
Tomas Hozza 2a39e7
-	if (node->data != NULL || node->down != NULL)
Tomas Hozza 2a39e7
+	if (KEEP_NODE(node, rbtdb))
Tomas Hozza 2a39e7
 		goto restore_locks;
Tomas Hozza 2a39e7
 
Tomas Hozza 2a39e7
+#undef KEEP_NODE
Tomas Hozza 2a39e7
+
Tomas Hozza 2a39e7
 	if (write_locked) {
Tomas Hozza 2a39e7
 		/*
Tomas Hozza 2a39e7
 		 * We can now delete the node.