From 7df87a748fae6a9f20d337d79ec83978856f0c48 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 31 Dec 2013 13:29:16 +0000 Subject: [PATCH] Fix memory leak in btr_splice_out_node(). Commit 072391fc (Improve btr_splice_out_node(), 2013-03) modified this function to take a pointer to a buffer tree node pointer so that the node pointer can be invalidated after it is spliced out. However, this also means the caller can no longer free its resources. Hence we must free the btrn in btr_splice_out_node() in order to avoid memory leaks. --- buffer_tree.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/buffer_tree.c b/buffer_tree.c index 5afa3ad3..44b73c94 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -771,6 +771,12 @@ void btr_drain(struct btr_node *btrn) btr_drop_buffer_reference(br); } +static void btr_free_node(struct btr_node *btrn) +{ + free(btrn->name); + free(btrn); +} + /** * Remove a node from a buffer tree. * @@ -798,8 +804,7 @@ void btr_remove_node(struct btr_node **btrnp) btr_drain(btrn); if (btrn->parent) list_del(&btrn->node); - free(btrn->name); - free(btrn); + btr_free_node(btrn); out: *btrnp = NULL; } @@ -862,6 +867,7 @@ void btr_splice_out_node(struct btr_node **btrnp) list_del(&ch->node); } assert(list_empty(&btrn->children)); + btr_free_node(btrn); *btrnp = NULL; } -- 2.39.2