From 7467dfe718aa1de8eba6fb16d2eb8b5b2248e017 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 10 Jan 2011 15:47:24 +1030 Subject: [PATCH] rbtree: don't use temporary context to destroy rbtree It leads to a memory leak if the allocation fails (as we reparent onto NULL). Also, the extra allocation in the failure path increases test time for failtest (under valgrind) by a factor of 2. --- ccan/rbtree/rbtree.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ccan/rbtree/rbtree.c b/ccan/rbtree/rbtree.c index 753935b3..e3b4a951 100644 --- a/ccan/rbtree/rbtree.c +++ b/ccan/rbtree/rbtree.c @@ -19,16 +19,16 @@ #include static void -tree_destructor_traverse_node(TALLOC_CTX *mem_ctx, trbt_node_t *node) +tree_destructor_traverse_node(trbt_node_t *node) { talloc_set_destructor(node, NULL); if (node->left) { - tree_destructor_traverse_node(mem_ctx, node->left); + tree_destructor_traverse_node(node->left); } if (node->right) { - tree_destructor_traverse_node(mem_ctx, node->right); + tree_destructor_traverse_node(node->right); } - talloc_steal(mem_ctx, node); + talloc_free(node); } /* @@ -36,7 +36,6 @@ tree_destructor_traverse_node(TALLOC_CTX *mem_ctx, trbt_node_t *node) */ static int tree_destructor(trbt_tree_t *tree) { - TALLOC_CTX *tmp_ctx; trbt_node_t *node; if (tree == NULL) { @@ -48,17 +47,14 @@ static int tree_destructor(trbt_tree_t *tree) return 0; } - /* traverse the tree and remove the node destructor and steal - the node to the temporary context. + /* traverse the tree and remove the node destructor then delete it. we dont want to use the existing destructor for the node since that will remove the nodes one by one from the tree. since the entire tree will be completely destroyed we dont care if it is inconsistent or unbalanced while freeing the individual nodes */ - tmp_ctx = talloc_new(NULL); - tree_destructor_traverse_node(tmp_ctx, node); - talloc_free(tmp_ctx); + tree_destructor_traverse_node(node); return 0; } -- 2.39.2