From: Simon Tatham Date: Mon, 2 Oct 2000 11:47:30 +0000 (+0000) Subject: Deletion case 2c can shift the root; case 3b is not the only case that X-Git-Tag: 0.50~48 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=4a2ea18a51a065539e55462c34445cea3e389283;p=PuTTY.git Deletion case 2c can shift the root; case 3b is not the only case that can do that. The bad case happens when you have a root node containing only one actual element, and its two child nodes have only one element each, and you try to delete the element in the root. [originally from svn r660] --- diff --git a/tree234.c b/tree234.c index 8101c78b..f97837a1 100644 --- a/tree234.c +++ b/tree234.c @@ -569,6 +569,17 @@ void del234(tree234 *t, void *e) { } n->elems[j] = NULL; n->kids[j+1] = NULL; + /* + * It's possible, in this case, that we've just removed + * the only element in the root of the tree. If so, + * shift the root. + */ + if (n->elems[0] == NULL) { + LOG((" shifting root!\n")); + t->root = a; + a->parent = NULL; + sfree(n); + } /* * Now go round the deletion process again, with n * pointing at the new big node and e still the same.