diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-10-01 06:37:24 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-10-01 06:37:24 -0700 |
commit | 415bf7e8ee1a89e6a7f8c0ffc3e941f5ba232658 (patch) | |
tree | db7cd4112a5431e3a543bfa2e090c65b67a644b0 | |
parent | 7098518a9bc43378afb5cbf599a074775c1d1d55 (diff) | |
download | txr-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.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -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; |