Subject: [PATCH 17/30] merge-recursive: Fix leaks of allocated renames and diff_filepairs

From: Elijah Newren <[email-masked]>
Date: Fri, 10 Nov 2017 11:05:37 -0800

get_renames() has always zero'ed out diff_queued_diff.nr while only
manually free'ing diff_filepairs that did not correspond to renames.
Further, it allocated struct renames that were tucked away in the
return string_list.  Make sure all of these are deallocated when we
are done with them.

Signed-off-by: Elijah Newren <[email-masked]>
---
 merge-recursive.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/merge-recursive.c b/merge-recursive.c
index 49710c0964..7a3402e50c 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1661,10 +1661,21 @@ static struct rename_info *handle_renames(struct merge_options *o,
 
 static void cleanup_renames(struct rename_info *re_info)
 {
-	string_list_clear(re_info->head_renames, 0);
-	string_list_clear(re_info->merge_renames, 0);
+	const struct rename *re;
+	int i;
 
+	for (i = 0; i < re_info->head_renames->nr; i++) {
+		re = re_info->head_renames->items[i].util;
+		diff_free_filepair(re->pair);
+	}
+	string_list_clear(re_info->head_renames, 1);
 	free(re_info->head_renames);
+
+	for (i = 0; i < re_info->merge_renames->nr; i++) {
+		re = re_info->merge_renames->items[i].util;
+		diff_free_filepair(re->pair);
+	}
+	string_list_clear(re_info->merge_renames, 1);
 	free(re_info->merge_renames);
 
 	free(re_info);
-- 
2.15.0.5.g9567be9905