From 14b55b5122349d18fa15f3b10c1067f19657ca10 Mon Sep 17 00:00:00 2001 From: Andrej Kacian Date: Mon, 8 Feb 2016 18:26:49 +0100 Subject: [PATCH] Make procmime_mimeinfo_free_all() zero the passed pointer. The function's argument type changes from MimeInfo* to MimeInfo**, so that we can zero out the pointer. This closes bug #3610, reported by Hanno Boeck. --- src/action.c | 2 +- src/compose.c | 8 ++++---- src/folder.c | 4 ++-- src/matcher.c | 6 +++--- src/mimeview.c | 4 ++-- src/plugins/clamd/clamav_plugin.c | 2 +- src/plugins/pgpinline/pgpinline.c | 2 +- src/plugins/pgpmime/pgpmime.c | 4 ++-- src/plugins/smime/smime.c | 6 +++--- src/plugins/tnef_parse/tnef_parse.c | 12 ++++++------ src/privacy.c | 2 +- src/procmime.c | 20 +++++++++++--------- src/procmime.h | 2 +- 13 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/action.c b/src/action.c index e78bf477b..57398f880 100644 --- a/src/action.c +++ b/src/action.c @@ -430,7 +430,7 @@ static gboolean parse_append_msgpart(GString *cmd, MsgInfo *msginfo, ret = procmime_get_part(part_filename, partinfo); if (single_part) - procmime_mimeinfo_free_all(partinfo); + procmime_mimeinfo_free_all(&partinfo); g_free(filename); if (ret < 0) { diff --git a/src/compose.c b/src/compose.c index f7d18a04f..ee9ce30e7 100644 --- a/src/compose.c +++ b/src/compose.c @@ -1535,7 +1535,7 @@ static void compose_extract_original_charset(Compose *compose) g_strdup(procmime_mimeinfo_get_parameter( partinfo, "charset")); } - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); } } @@ -3877,7 +3877,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo) if (!mimeinfo) return; if (mimeinfo->node->children == NULL) { - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return; } @@ -3947,7 +3947,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo) g_free(outfile); NEXT_PART_NOT_CHILD(child); } - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); } #undef NEXT_PART_NOT_CHILD @@ -5795,7 +5795,7 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action, gbool procmime_write_mimeinfo(mimemsg, fp); - procmime_mimeinfo_free_all(mimemsg); + procmime_mimeinfo_free_all(&mimemsg); return 0; } diff --git a/src/folder.c b/src/folder.c index f2237ecce..bf286b320 100644 --- a/src/folder.c +++ b/src/folder.c @@ -2896,7 +2896,7 @@ gchar *folder_item_fetch_msg(FolderItem *item, gint num) /* check for attachments */ if (mimeinfo != NULL) { g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo); - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED); } @@ -2943,7 +2943,7 @@ gchar *folder_item_fetch_msg_full(FolderItem *item, gint num, gboolean headers, /* check for attachments */ if (mimeinfo != NULL) { g_node_children_foreach(mimeinfo->node, G_TRAVERSE_ALL, msginfo_set_mime_flags, msginfo); - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED); } diff --git a/src/matcher.c b/src/matcher.c index 69600937f..f5d5f96d7 100644 --- a/src/matcher.c +++ b/src/matcher.c @@ -1707,18 +1707,18 @@ static gboolean matcherlist_match_body(MatcherList *matchers, gboolean body_only if (partinfo->type == MIMETYPE_TEXT) { first_text_found = TRUE; if (matcherlist_match_text_content(matchers, partinfo)) { - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return TRUE; } } else if (matcherlist_match_binary_content(matchers, partinfo)) { - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return TRUE; } if (body_only && first_text_found) break; } - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return FALSE; } diff --git a/src/mimeview.c b/src/mimeview.c index eb767b92e..69e590691 100644 --- a/src/mimeview.c +++ b/src/mimeview.c @@ -530,7 +530,7 @@ static void mimeview_free_mimeinfo(MimeView *mimeview) mimeview->check_data->free_after_use = TRUE; #endif if (mimeview->mimeinfo != NULL && !defer) { - procmime_mimeinfo_free_all(mimeview->mimeinfo); + procmime_mimeinfo_free_all(&mimeview->mimeinfo); mimeview->mimeinfo = NULL; } else if (defer) { #ifdef USE_PTHREAD @@ -1112,7 +1112,7 @@ static void mimeview_check_data_reset(MimeView *mimeview) if (must_free) { debug_print("freeing deferred mimeinfo\n"); - procmime_mimeinfo_free_all(mimeview->check_data->siginfo); + procmime_mimeinfo_free_all(&mimeview->check_data->siginfo); } g_free(mimeview->check_data); diff --git a/src/plugins/clamd/clamav_plugin.c b/src/plugins/clamd/clamav_plugin.c index ae11d7f7d..751d3cac6 100644 --- a/src/plugins/clamd/clamav_plugin.c +++ b/src/plugins/clamd/clamav_plugin.c @@ -193,7 +193,7 @@ static gboolean mail_filtering_hook(gpointer source, gpointer data) } } - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return (result.status == OK) ? FALSE : TRUE; } diff --git a/src/plugins/pgpinline/pgpinline.c b/src/plugins/pgpinline/pgpinline.c index 7dc15027f..dfe1ca7dc 100644 --- a/src/plugins/pgpinline/pgpinline.c +++ b/src/plugins/pgpinline/pgpinline.c @@ -437,7 +437,7 @@ static MimeInfo *pgpinline_decrypt(MimeInfo *mimeinfo) } g_node_unlink(decinfo->node); - procmime_mimeinfo_free_all(parseinfo); + procmime_mimeinfo_free_all(&parseinfo); decinfo->tmp = TRUE; diff --git a/src/plugins/pgpmime/pgpmime.c b/src/plugins/pgpmime/pgpmime.c index 670dfdc89..5b8b19088 100644 --- a/src/plugins/pgpmime/pgpmime.c +++ b/src/plugins/pgpmime/pgpmime.c @@ -410,7 +410,7 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo) } g_node_unlink(decinfo->node); - procmime_mimeinfo_free_all(parseinfo); + procmime_mimeinfo_free_all(&parseinfo); decinfo->tmp = TRUE; @@ -723,7 +723,7 @@ gboolean pgpmime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data) /* create encrypted multipart */ g_node_unlink(msgcontent->node); - procmime_mimeinfo_free_all(msgcontent); + procmime_mimeinfo_free_all(&msgcontent); g_node_append(mimeinfo->node, encmultipart->node); newinfo = procmime_mimeinfo_new(); diff --git a/src/plugins/smime/smime.c b/src/plugins/smime/smime.c index c4d0d85ab..526a03e24 100644 --- a/src/plugins/smime/smime.c +++ b/src/plugins/smime/smime.c @@ -296,7 +296,7 @@ static gint smime_check_signature(MimeInfo *mimeinfo) return -1; g_node_unlink(decinfo->node); - procmime_mimeinfo_free_all(newinfo); + procmime_mimeinfo_free_all(&newinfo); decinfo->tmp = TRUE; parentinfo = procmime_mimeinfo_parent(mimeinfo); @@ -506,7 +506,7 @@ static MimeInfo *smime_decrypt(MimeInfo *mimeinfo) } g_node_unlink(decinfo->node); - procmime_mimeinfo_free_all(parseinfo); + procmime_mimeinfo_free_all(&parseinfo); decinfo->tmp = TRUE; @@ -861,7 +861,7 @@ gboolean smime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data) g_free(textstr); /* create encrypted multipart */ - procmime_mimeinfo_free_all(msgcontent); + procmime_mimeinfo_free_all(&msgcontent); g_node_append(mimeinfo->node, encmultipart->node); encmultipart->content = MIMECONTENT_FILE; diff --git a/src/plugins/tnef_parse/tnef_parse.c b/src/plugins/tnef_parse/tnef_parse.c index 4abd2c585..e6943139e 100644 --- a/src/plugins/tnef_parse/tnef_parse.c +++ b/src/plugins/tnef_parse/tnef_parse.c @@ -69,7 +69,7 @@ static MimeInfo *tnef_broken_mimeinfo(const gchar *reason) fclose(fp); if (g_stat(tmpfilename, &statbuf) < 0) { claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return NULL; } @@ -118,14 +118,14 @@ static MimeInfo *tnef_dump_file(const gchar *filename, char *data, size_t size) FILE_OP_ERROR(tmpfilename, "fwrite"); fclose(fp); claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return tnef_broken_mimeinfo(_("Failed to write the part data.")); } fclose(fp); if (g_stat(tmpfilename, &statbuf) < 0) { claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return tnef_broken_mimeinfo(_("Failed to write the part data.")); } else { sub_info->tmp = TRUE; @@ -170,7 +170,7 @@ MimeInfo *tnef_parse_vcal(TNEFStruct *tnef) if (!result) { claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return tnef_broken_mimeinfo(_("Failed to parse VCalendar data.")); } return sub_info; @@ -209,7 +209,7 @@ MimeInfo *tnef_parse_vtask(TNEFStruct *tnef) } if (!result) { claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return tnef_broken_mimeinfo(_("Failed to parse VTask data.")); } return sub_info; @@ -259,7 +259,7 @@ MimeInfo *tnef_parse_vcard(TNEFStruct *tnef) if (!result) { claws_unlink(tmpfilename); - procmime_mimeinfo_free_all(sub_info); + procmime_mimeinfo_free_all(&sub_info); return tnef_broken_mimeinfo(_("Failed to parse VCard data.")); } return sub_info; diff --git a/src/privacy.c b/src/privacy.c index ffc61aeb4..c63fbbdad 100644 --- a/src/privacy.c +++ b/src/privacy.c @@ -307,7 +307,7 @@ static gint decrypt(MimeInfo *mimeinfo, PrivacySystem *system) parentinfo = procmime_mimeinfo_parent(mimeinfo); childnumber = g_node_child_index(parentinfo->node, mimeinfo); - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); g_node_insert(parentinfo->node, childnumber, decryptedinfo->node); diff --git a/src/procmime.c b/src/procmime.c index bcb3db2e3..7823ccf80 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -138,13 +138,12 @@ static gboolean free_func(GNode *node, gpointer data) if (mimeinfo->privacy) privacy_free_privacydata(mimeinfo->privacy); - g_free(mimeinfo); - return FALSE; } -void procmime_mimeinfo_free_all(MimeInfo *mimeinfo) +void procmime_mimeinfo_free_all(MimeInfo **mimeinfo_ptr) { + MimeInfo *mimeinfo = *mimeinfo_ptr; GNode *node; if (!mimeinfo) @@ -154,6 +153,9 @@ void procmime_mimeinfo_free_all(MimeInfo *mimeinfo) g_node_traverse(node, G_IN_ORDER, G_TRAVERSE_ALL, -1, free_func, NULL); g_node_destroy(node); + + g_free(mimeinfo); + *mimeinfo_ptr = NULL; } MimeInfo *procmime_mimeinfo_parent(MimeInfo *mimeinfo) @@ -946,17 +948,17 @@ scan_again: * fully for non-empty parts */ short_scan = FALSE; - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); goto scan_again; } else if (!empty_ok && !short_scan) { /* if full scan didn't find a non-empty part, rescan * accepting empty parts */ empty_ok = TRUE; - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); goto scan_again; } - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); /* outfp already unlocked at this time */ return outfp; @@ -1019,7 +1021,7 @@ FILE *procmime_get_first_encrypted_text_content(MsgInfo *msginfo) if (partinfo) outfp = procmime_get_text_content(partinfo); - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); /* outfp already unlocked at this time */ return outfp; @@ -1039,7 +1041,7 @@ gboolean procmime_msginfo_is_encrypted(MsgInfo *msginfo) partinfo = mimeinfo; result = (find_encrypted_part(partinfo) != NULL); - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return result; } @@ -2043,7 +2045,7 @@ static int procmime_parse_mimepart(MimeInfo *parent, * this avoids DOSsing ourselves * with enormous messages */ - procmime_mimeinfo_free_all(mimeinfo); + procmime_mimeinfo_free_all(&mimeinfo); return -1; } g_node_append(parent->node, mimeinfo->node); diff --git a/src/procmime.h b/src/procmime.h index 6f82857a5..5fae87a29 100644 --- a/src/procmime.h +++ b/src/procmime.h @@ -159,7 +159,7 @@ extern "C" { /* MimeInfo handling */ MimeInfo *procmime_mimeinfo_new (void); -void procmime_mimeinfo_free_all (MimeInfo *mimeinfo); +void procmime_mimeinfo_free_all (MimeInfo **mimeinfo_ptr); MimeInfo *procmime_mimeinfo_insert (MimeInfo *parent, MimeInfo *mimeinfo); -- 2.25.1