]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2750] Fix overall loop condition in removeRebalance()
authorMukund Sivaraman <muks@isc.org>
Mon, 2 Sep 2013 10:25:03 +0000 (15:55 +0530)
committerMukund Sivaraman <muks@isc.org>
Mon, 2 Sep 2013 10:25:03 +0000 (15:55 +0530)
It needs to check at the upper node if child is NULL!

src/lib/datasrc/memory/domaintree.h

index faf4424a5af4e47a73bb5b91592ebeca3b89f973..875ab265df8c7fb4755b4546cd5e4257d3df8b9a 100644 (file)
@@ -1728,7 +1728,7 @@ private:
 
     void
     removeRebalance(typename DomainTreeNode<T>::DomainTreeNodePtr* root_ptr,
-                    DomainTreeNode<T>* child);
+                    DomainTreeNode<T>* child, DomainTreeNode<T>* parent);
 
     DomainTreeNode<T>*
     rightRotate(typename DomainTreeNode<T>::DomainTreeNodePtr* root,
@@ -2349,7 +2349,7 @@ DomainTree<T>::remove(util::MemorySegment& mem_sgmt, DomainTreeNode<T>* node,
             // red-black tree again.
             typename DomainTreeNode<T>::DomainTreeNodePtr* root_ptr =
                 upper_node ? &(upper_node->down_) : &root_;
-            removeRebalance(root_ptr, child);
+            removeRebalance(root_ptr, child, node->getParent());
         }
     }
 
@@ -2672,13 +2672,11 @@ template <typename T>
 void
 DomainTree<T>::removeRebalance
     (typename DomainTreeNode<T>::DomainTreeNodePtr* root_ptr,
-     DomainTreeNode<T>* child)
+     DomainTreeNode<T>* child,  DomainTreeNode<T>* parent)
 {
     // Case 1. Repeat until we reach the root node of this subtree in
     // the forest.
-    while (child && (!child->isSubTreeRoot())) {
-        DomainTreeNode<T>* 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<T>::removeRebalance
 
             if (parent->isBlack()) {
                 child = parent;
+                parent = parent->getParent();
                 continue;
             } else {
                 parent->setColor(DomainTreeNode<T>::BLACK);