summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-10-01 06:37:24 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-10-01 06:37:24 -0700
commit415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658 (patch)
treedb7cd4112a5431e3a543bfa2e090c65b67a644b0
parent7098518a9bc43378afb5cbf599a074775c1d1d55 (diff)
downloadtxr-415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658.tar.gz
txr-415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658.tar.bz2
txr-415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658.zip
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.
-rw-r--r--tree.c13
1 files 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;