From 415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 1 Oct 2019 06:37:24 -0700 Subject: tree: crash when root is to be replaced. * tree.c (tr_insert): When the inserted key matches the root node, then there is nothing in ti->path and ti->depth is zero. We are accessing ti->path[-1] to get a root node. We must test for zero depth and install the new node as the tree root in that case. --- tree.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tree.c b/tree.c index 45132648..b7e528eb 100644 --- a/tree.c +++ b/tree.c @@ -265,11 +265,16 @@ static void tr_insert(struct tree *tr, struct tree_iter *ti, val parent = ti->path[ti->depth - 1]; node->tn.left = subtree->tn.left; node->tn.right = subtree->tn.right; + if (ti->depth > 0) { + val parent = ti->path[ti->depth - 1]; - if (parent->tn.left == subtree) - parent->tn.left = node; - else - parent->tn.right = node; + if (parent->tn.left == subtree) + parent->tn.left = node; + else + parent->tn.right = node; + } else { + tr->root = node; + } } else { if (subtree->tn.right) { ti->path[ti->depth++] = subtree; -- cgit v1.2.3