From 816211e894fad54335b85e24360724993a731d37 Mon Sep 17 00:00:00 2001 From: gfgit Date: Thu, 31 Aug 2023 15:50:06 +0200 Subject: [PATCH] procmime.c procmime_parse_multipart() fix leak - additional_header was not freed in every code path. - Also no need to allocate it at the beginning --- src/procmime.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/procmime.c b/src/procmime.c index a762d6431..b796bc68d 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -1746,7 +1746,7 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) int result = 0; gboolean start_found = FALSE; gboolean end_found = FALSE; - GPtrArray *additional_headers = g_ptr_array_new(); + GPtrArray *additional_headers = NULL; boundary = g_hash_table_lookup(mimeinfo->typeparameters, "boundary"); if (!boundary) @@ -1784,9 +1784,9 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) hentry[4].body, hentry[5].body, mimeinfo->data.filename, lastoffset, len); - if (g_hash_table_lookup(childinfo->typeparameters, "protected-headers")) { + if (additional_headers && g_hash_table_lookup(childinfo->typeparameters, "protected-headers")) { for (int i = 0; i < additional_headers->len; i ++ ) { - Header *hdr = g_ptr_array_index(additional_headers,i); + Header *hdr = g_ptr_array_steal_index(additional_headers,i); procmime_mimeinfo_add_extra_header(childinfo, hdr); } g_ptr_array_free(additional_headers, TRUE); @@ -1812,12 +1812,18 @@ static void procmime_parse_multipart(MimeInfo *mimeinfo, gboolean short_scan) g_free(curheader->body); curheader->body = NULL; } - additional_headers = g_ptr_array_new(); + if(additional_headers) + g_ptr_array_free(additional_headers, TRUE); + additional_headers = g_ptr_array_new_with_free_func(procheader_header_free); procheader_get_all_header_fields(fp, hentry, additional_headers); FILL_HEADERS(); lastoffset = ftell(fp); } } + + if(additional_headers) + g_ptr_array_free(additional_headers, TRUE); + if (start_found && !end_found && lastoffset != -1) { gint len = (ftell(fp) - strlen(buf)) - lastoffset - 1;