From: Mukund Sivaraman Date: Mon, 2 Sep 2013 10:25:03 +0000 (+0530) Subject: [2750] Fix overall loop condition in removeRebalance() X-Git-Tag: bind10-1.2.0beta1-release~193^2~4^2~37 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=313c564232efbcfc2cc8d34593ce9494ba96d629;p=thirdparty%2Fkea.git [2750] Fix overall loop condition in removeRebalance() It needs to check at the upper node if child is NULL! --- diff --git a/src/lib/datasrc/memory/domaintree.h b/src/lib/datasrc/memory/domaintree.h index faf4424a5a..875ab265df 100644 --- a/src/lib/datasrc/memory/domaintree.h +++ b/src/lib/datasrc/memory/domaintree.h @@ -1728,7 +1728,7 @@ private: void removeRebalance(typename DomainTreeNode::DomainTreeNodePtr* root_ptr, - DomainTreeNode* child); + DomainTreeNode* child, DomainTreeNode* parent); DomainTreeNode* rightRotate(typename DomainTreeNode::DomainTreeNodePtr* root, @@ -2349,7 +2349,7 @@ DomainTree::remove(util::MemorySegment& mem_sgmt, DomainTreeNode* node, // red-black tree again. typename DomainTreeNode::DomainTreeNodePtr* root_ptr = upper_node ? &(upper_node->down_) : &root_; - removeRebalance(root_ptr, child); + removeRebalance(root_ptr, child, node->getParent()); } } @@ -2672,13 +2672,11 @@ template void DomainTree::removeRebalance (typename DomainTreeNode::DomainTreeNodePtr* root_ptr, - DomainTreeNode* child) + DomainTreeNode* child, DomainTreeNode* parent) { // Case 1. Repeat until we reach the root node of this subtree in // the forest. - while (child && (!child->isSubTreeRoot())) { - DomainTreeNode* parent = child->getParent(); - + while (&(parent->down_) != root_ptr) { // A sibling node is defined as the parent's other child. It // exists at the same level as child. Note that child can be // NULL here. @@ -2786,6 +2784,7 @@ DomainTree::removeRebalance if (parent->isBlack()) { child = parent; + parent = parent->getParent(); continue; } else { parent->setColor(DomainTreeNode::BLACK);