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