43 lines
1.3 KiB
Diff
43 lines
1.3 KiB
Diff
|
commit 3a2ea636103eaf40404fb82f228605d384c36434
|
||
|
Author: Mark Andrews <marka@isc.org>
|
||
|
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.
|