diff options
author | Michael Pavone <pavone@retrodev.com> | 2017-03-21 19:48:08 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2017-03-21 19:48:08 -0700 |
commit | 4adb4b1013e6fbd057fe6158a911e7b860a78075 (patch) | |
tree | 3d91eb7e0b16dd57d7bddcfc7a0d83103593110e | |
parent | f8d991fc1b1ab7ae0c3d8a0307b8b2419d152278 (diff) |
Don't leak a ternary tree when building the menu's initial path
-rw-r--r-- | menu.c | 2 | ||||
-rw-r--r-- | tern.c | 13 | ||||
-rw-r--r-- | tern.h | 1 |
3 files changed, 16 insertions, 0 deletions
@@ -177,6 +177,8 @@ void * menu_write_w(uint32_t address, void * context, uint16_t value) tern_node *vars = tern_insert_ptr(NULL, "HOME", get_home_dir()); vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir()); menu->curpath = replace_vars(menu->curpath, vars, 1); + tern_free(vars); + } if (menu->state) { uint32_t dst = menu->latch << 16 | value; @@ -224,3 +224,16 @@ tern_node * tern_get_node(tern_val value) { return value.intval & 1 ? (tern_node *)(value.intval & ~1) : NULL; } + +void tern_free(tern_node *head) +{ + if (head->left) { + tern_free(head->left); + } + if (head->right) { + tern_free(head->right); + } + if (head->el) { + tern_free(head->straight.next); + } +} @@ -42,5 +42,6 @@ uint32_t tern_count(tern_node *head); void tern_foreach(tern_node *head, iter_fun fun, void *data); char * tern_int_key(uint32_t key, char * buf); tern_node * tern_get_node(tern_val value); +void tern_free(tern_node *head); #endif //TERN_H_ |