Make procmime_mimeinfo_free_all() zero the passed pointer.
authorAndrej Kacian <ticho@claws-mail.org>
Mon, 8 Feb 2016 17:26:49 +0000 (18:26 +0100)
committerAndrej Kacian <ticho@claws-mail.org>
Mon, 8 Feb 2016 17:28:08 +0000 (18:28 +0100)
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.

13 files changed:
src/action.c
src/compose.c
src/folder.c
src/matcher.c
src/mimeview.c
src/plugins/clamd/clamav_plugin.c
src/plugins/pgpinline/pgpinline.c
src/plugins/pgpmime/pgpmime.c
src/plugins/smime/smime.c
src/plugins/tnef_parse/tnef_parse.c
src/privacy.c
src/procmime.c
src/procmime.h

index e78bf477b93db3d8d9b398a62f7a2d13cae8f53b..57398f880d6b59b7998e16928931ba77756fd80c 100644 (file)
@@ -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) {
index f7d18a04f5548b7fdbd56a7aafc55363f7bbe2d9..ee9ce30e766eaee9c578eb16b98be9990cd413d1 100644 (file)
@@ -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;
 }
index f2237ecce7c960980c0cecc4c857f1b38bc86f82..bf286b3205d8004b1193bc36533272c819f9e955 100644 (file)
@@ -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);
                        }
index 69600937f908d7cbdce54ed3fe18e3a19da39c66..f5d5f96d701bafbb75a40d3bf4c459550de649a3 100644 (file)
@@ -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;
 }
index eb767b92ee0fbe5d09a8efccd9d99c79fe1cf5cd..69e590691caf2e74e6093305a5ce756aa6e66a8a 100644 (file)
@@ -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);
index ae11d7f7d8a5232bcf84ddbcfa8d7cfbf9b0406a..751d3cac6ab0bc9f4c5bc5853cf87c7268ef9b04 100644 (file)
@@ -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;
 }
index 7dc15027fb499efcd9ec2937a21afd7042b1e4e4..dfe1ca7dc7b0a596f9f857d904d8632620f576c3 100644 (file)
@@ -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;
 
index 670dfdc89f4a50e52aff185dcb12aa05c8bc0b55..5b8b19088076359697c75ffc083ad6d14d1101c9 100644 (file)
@@ -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();
index c4d0d85abb240b1627bf53c32fa202418b860467..526a03e242f327bc5f650e9fc4647205e46ef0f3 100644 (file)
@@ -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;
index 4abd2c585e7741d39fd11ea9bf19367f4337b6ae..e6943139ebcdd42a30c78bff2c16e3dbd9397f8c 100644 (file)
@@ -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;
index ffc61aeb4c0c80b5bc345f62037e0ac85c529ca2..c63fbbdadbed0a9ba06d28e3d3d28e19e756ac35 100644 (file)
@@ -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);
 
index bcb3db2e32c7d15d1770ce17dead50da4e674827..7823ccf80526c881843d5b9328e01067a0739c68 100644 (file)
@@ -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);
index 6f82857a575cd76648f57b3b1b92e1e59d0c66ac..5fae87a29b9d556fd2e97fb63af9aaebe812792c 100644 (file)
@@ -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);