diff options
author | Kevin Willford <kewillf@microsoft.com> | 2017-08-28 14:28:27 -0600 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-09-06 13:10:20 +0900 |
commit | e336bdc5b9bcb62982da9708dfb6e68150de72a3 (patch) | |
tree | f7056c81e03690e81af9d50b6b1cfb8170eed733 /merge-recursive.c | |
parent | edc74bc7f0c6884027e851ef09b2e0c9380dcd45 (diff) | |
download | git-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.c | 12 |
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; |