Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
merge-recursive: fix memory leak
author
Kevin Willford
<kewillf@microsoft.com>
Mon, 28 Aug 2017 20:28:27 +0000
(14:28 -0600)
committer
Junio C Hamano
<gitster@pobox.com>
Wed, 6 Sep 2017 04:10:20 +0000
(13:10 +0900)
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>
merge-recursive.c
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
edc74bc
)
diff --git
a/merge-recursive.c
b/merge-recursive.c
index 1494ffdb828106882053065e3ac8cc383136cf80..033d7cd4062bcf398280c7bdc29be8dad77a6688 100644
(file)
--- 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)
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;
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;
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++) {
}
}
for (i = 0; i < entries->nr; i++) {
@@
-1975,6
+1977,7
@@
int merge_trees(struct merge_options *o,
entries->items[i].string);
}
entries->items[i].string);
}
+cleanup:
string_list_clear(re_merge, 0);
string_list_clear(re_head, 0);
string_list_clear(entries, 1);
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);
free(re_merge);
free(re_head);
free(entries);
+
+ if (clean < 0)
+ return clean;
}
else
clean = 1;
}
else
clean = 1;