Web lists-archives.com

Re: [PATCH 1/3] merge-recursive: fix memory leak






On 8/28/2017 4:28 PM, Kevin Willford wrote:
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@xxxxxxxxxxxxx>

Nice catch on the leaks.  Looks good to me.

---
  merge-recursive.c | 12 +++++++++---
  1 file 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;