From: Andre Noll <maan@systemlinux.org>
Date: Tue, 31 Dec 2013 13:29:16 +0000 (+0000)
Subject: Fix memory leak in btr_splice_out_node().
X-Git-Tag: v0.5.3~24
X-Git-Url: https://git.tuebingen.mpg.de/?a=commitdiff_plain;h=7df87a748fae6a9f20d337d79ec83978856f0c48;p=paraslash.git

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.
---

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;
 }