summaryrefslogtreecommitdiff
path: root/merge-recursive.c
diff options
context:
space:
mode:
authorKevin Willford <kewillf@microsoft.com>2017-08-28 14:28:27 -0600
committerJunio C Hamano <gitster@pobox.com>2017-09-06 13:10:20 +0900
commite336bdc5b9bcb62982da9708dfb6e68150de72a3 (patch)
treef7056c81e03690e81af9d50b6b1cfb8170eed733 /merge-recursive.c
parentedc74bc7f0c6884027e851ef09b2e0c9380dcd45 (diff)
downloadgit-e336bdc5b9bcb62982da9708dfb6e68150de72a3.tar.gz
merge-recursive: fix memory leak
In merge_trees if process_renames or process_entry returns less than zero, the method will just return and not free re_merge, re_head, or entries. This change cleans up the allocated variables before returning to the caller. Signed-off-by: Kevin Willford <kewillf@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-recursive.c')
-rw-r--r--merge-recursive.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index 1494ffdb82..033d7cd406 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1956,7 +1956,7 @@ int merge_trees(struct merge_options *o,
re_merge = get_renames(o, merge, common, head, merge, entries);
clean = process_renames(o, re_head, re_merge);
if (clean < 0)
- return clean;
+ goto cleanup;
for (i = entries->nr-1; 0 <= i; i--) {
const char *path = entries->items[i].string;
struct stage_data *e = entries->items[i].util;
@@ -1964,8 +1964,10 @@ int merge_trees(struct merge_options *o,
int ret = process_entry(o, path, e);
if (!ret)
clean = 0;
- else if (ret < 0)
- return ret;
+ else if (ret < 0) {
+ clean = ret;
+ goto cleanup;
+ }
}
}
for (i = 0; i < entries->nr; i++) {
@@ -1975,6 +1977,7 @@ int merge_trees(struct merge_options *o,
entries->items[i].string);
}
+cleanup:
string_list_clear(re_merge, 0);
string_list_clear(re_head, 0);
string_list_clear(entries, 1);
@@ -1982,6 +1985,9 @@ int merge_trees(struct merge_options *o,
free(re_merge);
free(re_head);
free(entries);
+
+ if (clean < 0)
+ return clean;
}
else
clean = 1;