mirror of
https://github.com/isc-projects/bind9.git
synced 2026-02-27 12:02:10 -05:00
Gracefully handle resending a node to prune_tree()
Commit801e888d03made the prune_tree() function use send_to_prune_tree() for triggering pruning of deleted leaf nodes' parents. This enabled the following sequence of events to happen: 1. Node A, which is a leaf node, is passed to send_to_prune_tree() and its pruning is queued. 2. Node B is added to the RBTDB as a child of node A before the latter gets pruned. 3. Node B, which is now a leaf node itself (and is likely to belong to a different node bucket than node A), is passed to send_to_prune_tree() and its pruning gets queued. 4. Node B gets pruned. Its parent, node A, now becomes a leaf again and therefore the prune_tree() call that handled node B calls send_to_prune_tree() for node A. 5. Since node A was already queued for pruning in step 1 (but not yet pruned), the INSIST(!ISC_LINK_LINKED(node, prunelink)); assertion fails for node A in send_to_prune_tree(). The above sequence of events is not a sign of pathological behavior. Replace the assertion check with a conditional early return from send_to_prune_tree(). (cherry picked from commitf6289ad931)
This commit is contained in:
parent
0a2746acba
commit
cb9928aaeb
1 changed files with 3 additions and 1 deletions
|
|
@ -1980,7 +1980,9 @@ send_to_prune_tree(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
isc_rwlocktype_t nlocktype) {
|
||||
bool pruning_queued = !ISC_LIST_EMPTY(rbtdb->prunenodes[node->locknum]);
|
||||
|
||||
INSIST(!ISC_LINK_LINKED(node, prunelink));
|
||||
if (ISC_LINK_LINKED(node, prunelink)) {
|
||||
return;
|
||||
}
|
||||
|
||||
new_reference(rbtdb, node, nlocktype);
|
||||
ISC_LIST_APPEND(rbtdb->prunenodes[node->locknum], node, prunelink);
|
||||
|
|
|
|||
Loading…
Reference in a new issue