Always fixup after deleting a black child node in rbtree
authorskids <bri@abrij.org>
Tue, 25 Jun 2013 00:40:48 +0000 (20:40 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 30 Jun 2013 14:45:25 +0000 (10:45 -0400)
This prevents rbtree_delete from creating unbalanced/illegal rbtrees.

src/lib/rbtree.c

index 2f452e6..056e905 100644 (file)
@@ -364,7 +364,7 @@ static void DeleteFixup(rbtree_t *tree, rbnode_t *X, rbnode_t *Parent)
                        }
                }
        }
-       X->Color = Black;
+       if (X != NIL) X->Color = Black; /* Avoid cache-dirty on NIL */
 }
 
 /*
@@ -413,7 +413,7 @@ void rbtree_delete(rbtree_t *tree, rbnode_t *Z)
                Z->Data = Y->Data;
                Y->Data = NULL;
 
-               if (Y->Color == Black && X != NIL)
+               if (Y->Color == Black)
                        DeleteFixup(tree, X, Parent);
 
                /*
@@ -439,7 +439,7 @@ void rbtree_delete(rbtree_t *tree, rbnode_t *Z)
        } else {
                if (tree->freeNode) tree->freeNode(Y->Data);
 
-               if (Y->Color == Black && X != NIL)
+               if (Y->Color == Black)
                        DeleteFixup(tree, X, Parent);
 
                free(Y);