[PATCH 2/3] Fix memory leak in apply_patch in apply.c.
- From
Jared Hance <jaredhance@gmail.com>
- Date
- Mar 3, 2012, 02:31 UTC
- Message-ID
- <03cc2ba05a5744d8b48700556f1942757151ec4b.1330740964.git.jaredhance@gmail.com>
- In-Reply-To
- <cover.1330740964.git.jaredhance@gmail.com>
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@gmail.com> --- 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