You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.3 KiB
42 lines
1.3 KiB
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.
|
|
|