diff options
author | c | 2024-03-30 11:07:53 -0400 |
---|---|---|
committer | c | 2024-03-30 11:07:53 -0400 |
commit | 68473db6798bc80aab7b39105ba88865015eb27c (patch) | |
tree | 4aec47f33e5792c1b5178d8b42da331ce3a8dd8a /src/tree.c | |
parent | c26c65dcf836a86ff3374a3e92e57ec61568e8c9 (diff) |
Fixed double-free.
Was from not clearing parent tree pointers.
Diffstat (limited to 'src/tree.c')
-rw-r--r-- | src/tree.c | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -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); |