In the while loop inside apply_patch, patch is dynamically allocated with a calloc. However, only unused patches are actually free'd; the rest are left in a memory leak. Since a list is actively built up consisting of the used patches, they can simply be iterated and free'd at the end of the function. Signed-off-by: Jared Hance <jaredhance@xxxxxxxxx> --- builtin/apply.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/builtin/apply.c b/builtin/apply.c index 389898f..92ebd57 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -3685,9 +3685,9 @@ static int apply_patch(int fd, const char *filename, int options) size_t offset; struct strbuf buf = STRBUF_INIT; struct patch *list = NULL, **listp = &list; + struct patch *patch_iter; int skipped_patch = 0; - /* FIXME - memory leak when using multiple patch files as inputs */ memset(&fn_table, 0, sizeof(struct string_list)); patch_input_file = filename; read_patch_file(&buf, fd); @@ -3712,7 +3712,6 @@ static int apply_patch(int fd, const char *filename, int options) listp = &patch->next; } else { - /* perhaps free it a bit better? */ free(patch); skipped_patch++; } @@ -3753,6 +3752,13 @@ static int apply_patch(int fd, const char *filename, int options) if (summary) summary_patch_list(list); + + patch_iter = list; + while(patch_iter != NULL) { + struct patch *patch_iter_next = patch_iter->next; + free(patch_iter); + patch_iter = patch_iter_next; + } strbuf_release(&buf); return 0; -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html