aboutsummaryrefslogtreecommitdiff
path: root/src/tree.c
diff options
context:
space:
mode:
authorc2024-03-30 11:07:53 -0400
committerc2024-03-30 11:07:53 -0400
commit68473db6798bc80aab7b39105ba88865015eb27c (patch)
tree4aec47f33e5792c1b5178d8b42da331ce3a8dd8a /src/tree.c
parentc26c65dcf836a86ff3374a3e92e57ec61568e8c9 (diff)
Fixed double-free.
Was from not clearing parent tree pointers.
Diffstat (limited to 'src/tree.c')
-rw-r--r--src/tree.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/tree.c b/src/tree.c
index 84334be..6d58220 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -53,6 +53,26 @@ tree_t* tree_init(tree_type_t type, tree_t* parent) {
void tree_destroy(tree_t* tree) {
if (!tree) { return; }
+ if (tree->parent && tree->type == TREE_TYPE_CALL) {
+ tree_t* treep = tree->parent;
+ switch (treep->type) {
+ case TREE_TYPE_BLOCK:
+ treep->data.block.val = NULL;
+ break;
+ case TREE_TYPE_EXPR:
+ treep->data.expr.val = NULL;
+ break;
+ case TREE_TYPE_CARG:
+ treep->data.carg.val = NULL;
+ break;
+ case TREE_TYPE_DEF:
+ treep->data.def.val = NULL;
+ break;
+ default:
+ break;
+ }
+ }
+
switch (tree->type) {
case TREE_TYPE_BLOCK:
tree_destroy(tree->data.block.val);