Make procmsg_msginfo_free() zero out pointers to freed memory.
authorAndrej Kacian <ticho@claws-mail.org>
Sat, 23 Jan 2016 14:40:38 +0000 (15:40 +0100)
committerAndrej Kacian <ticho@claws-mail.org>
Sat, 23 Jan 2016 15:45:02 +0000 (16:45 +0100)
The function's argument type changes from MsgInfo* to MsgInfo**,
so that we can zero out the pointer.

This closes bug #3598, reported by Hanno Boeck.

21 files changed:
src/action.c
src/compose.c
src/folder.c
src/folderutils.c
src/imap.c
src/inc.c
src/mainwindow.c
src/mbox.c
src/messageview.c
src/mh.c
src/msgcache.c
src/partial_download.c
src/plugins/att_remover/att_remover.c
src/plugins/vcalendar/common-views.c
src/plugins/vcalendar/vcal_folder.c
src/plugins/vcalendar/vcalendar.c
src/procmime.c
src/procmsg.c
src/procmsg.h
src/send_message.c
src/summaryview.c

index 86fd198..e78bf47 100644 (file)
@@ -1445,7 +1445,7 @@ static void catch_status(GPid pid, gint status, gpointer data)
                                modified_something = TRUE;
                                last_item = nmi->folder;
                        }
-                       procmsg_msginfo_free (nmi);
+                       procmsg_msginfo_free (&nmi);
                        if (summaryview && summaryview->displayed &&
                            summaryview->folder_item == msginfo->folder &&
                            summary_get_msgnum(summaryview, summaryview->displayed) == msginfo->msgnum)
index 81947e7..af64a83 100644 (file)
@@ -1205,7 +1205,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
                }
 
        }
-       procmsg_msginfo_free( dummyinfo );
+       procmsg_msginfo_free( &dummyinfo );
 
        if (attach_files) {
                GList *curr;
@@ -1826,7 +1826,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
                quote_fmt_reset_vartable();
 
                g_free(tmp);
-               procmsg_msginfo_free(full_msginfo);
+               procmsg_msginfo_free(&full_msginfo);
        }
 
        textview = GTK_TEXT_VIEW(compose->text);
@@ -1885,7 +1885,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInfo *msginfo,
                quote_fmt_reset_vartable();
                compose_attach_parts(compose, msginfo);
 
-               procmsg_msginfo_free(full_msginfo);
+               procmsg_msginfo_free(&full_msginfo);
        }
 
        SIGNAL_BLOCK(textbuf);
@@ -3189,7 +3189,7 @@ error:
 ok:
        SIGNAL_UNBLOCK(buffer);
 
-       procmsg_msginfo_free( dummyinfo );
+       procmsg_msginfo_free( &dummyinfo );
 
        return buf;
 }
@@ -3778,7 +3778,7 @@ static gboolean compose_attach_append(Compose *compose, const gchar *file,
 
                        ainfo->name = g_strdup_printf(_("Message: %s"), name);
 
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                } else {
                        if (!g_ascii_strncasecmp(content_type, "text/", 5)) {
                                ainfo->charset = g_strdup(charset);
@@ -5214,7 +5214,7 @@ gint compose_send(Compose *compose)
                                if (tmp) {
                                        debug_print("removing %d via %s\n", tmp->msgnum, tmsgid);
                                        folder_item_remove_msg(folder, tmp->msgnum);
-                                       procmsg_msginfo_free(tmp);
+                                       procmsg_msginfo_free(&tmp);
                                } 
                        }
                }
@@ -5230,7 +5230,7 @@ gint compose_send(Compose *compose)
                        if (tmp) {
                                debug_print("removing %d via %s\n", tmp->msgnum, tmsgid);
                                folder_item_remove_msg(folder, tmp->msgnum);
-                               procmsg_msginfo_free(tmp);
+                               procmsg_msginfo_free(&tmp);
                        }
                }
                if (!discard_window) {
@@ -8615,7 +8615,7 @@ static void compose_template_apply(Compose *compose, Template *tmpl,
 
                        parsed_str = compose_quote_fmt(compose, dummyinfo,
                                                           tmpl->value, qmark, tmp, FALSE, FALSE, err_msg);
-                       procmsg_msginfo_free( dummyinfo );
+                       procmsg_msginfo_free( &dummyinfo );
 
                        g_free( tmp );
                } 
@@ -8781,7 +8781,7 @@ static void compose_template_apply_fields(Compose *compose, Template *tmpl)
                }
        }
 
-       procmsg_msginfo_free( dummyinfo );
+       procmsg_msginfo_free( &dummyinfo );
 }
 
 static void compose_destroy(Compose *compose)
@@ -8816,9 +8816,9 @@ static void compose_destroy(Compose *compose)
        hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST,
                        compose->folder_update_callback_id);
 
-       procmsg_msginfo_free(compose->targetinfo);
-       procmsg_msginfo_free(compose->replyinfo);
-       procmsg_msginfo_free(compose->fwdinfo);
+       procmsg_msginfo_free(&(compose->targetinfo));
+       procmsg_msginfo_free(&(compose->replyinfo));
+       procmsg_msginfo_free(&(compose->fwdinfo));
 
        g_free(compose->replyto);
        g_free(compose->cc);
@@ -10144,7 +10144,7 @@ gboolean compose_draft (gpointer data, guint action)
                }
                if (tmpinfo) {
                        msgnum = tmpinfo->msgnum;
-                       procmsg_msginfo_free(tmpinfo);
+                       procmsg_msginfo_free(&tmpinfo);
                        debug_print("got draft msgnum %d from scanning\n", msgnum);
                } else {
                        debug_print("didn't get draft msgnum after scanning\n");
@@ -10202,7 +10202,7 @@ warn_err:
                if (action == COMPOSE_DRAFT_FOR_EXIT) {
                        compose_register_draft(newmsginfo);
                }
-               procmsg_msginfo_free(newmsginfo);
+               procmsg_msginfo_free(&newmsginfo);
        }
        
        folder_item_scan(draft);
@@ -10228,7 +10228,7 @@ warn_err:
                }
                g_free(path);
 
-               procmsg_msginfo_free(compose->targetinfo);
+               procmsg_msginfo_free(&(compose->targetinfo));
                compose->targetinfo = procmsg_msginfo_new();
                compose->targetinfo->msgnum = msgnum;
                compose->targetinfo->size = (goffset)s.st_size;
@@ -11872,7 +11872,7 @@ static void compose_reply_from_messageview_real(MessageView *msgview, GSList *ms
 
        if (new_msglist) {
                compose = compose_reply_mode((ComposeMode)action, new_msglist, body);
-               procmsg_msginfo_free(tmp_msginfo);
+               procmsg_msginfo_free(&tmp_msginfo);
                g_slist_free(new_msglist);
        } else
                compose = compose_reply_mode((ComposeMode)action, msginfo_list, body);
index 705db37..f2237ec 100644 (file)
@@ -1981,8 +1981,9 @@ static gint folder_item_syncronize_flags(FolderItem *item)
        
        ret = syncronize_flags(item, msglist);
 
-       for (cur = msglist; cur != NULL; cur = g_slist_next(cur))
-               procmsg_msginfo_free((MsgInfo *) cur->data);
+       for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
+               procmsg_msginfo_free((MsgInfo **)&(cur->data));
+       }
        
        g_slist_free(msglist);
 
@@ -2062,7 +2063,7 @@ gint folder_item_close(FolderItem *item)
                        msginfo = (MsgInfo *) cur->data;
                        if (MSG_IS_NEW(msginfo->flags))
                                procmsg_msginfo_unset_flags(msginfo, MSG_NEW, 0);
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                }
                g_slist_free(mlist);
                folder_item_update_thaw();
@@ -2283,7 +2284,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                        if (msginfo && folder->klass->is_msg_changed && folder->klass->is_msg_changed(folder, item, msginfo)) {
                                msgcache_remove_msg(item->cache, msginfo->msgnum);
                                new_list = g_slist_prepend(new_list, GINT_TO_POINTER(msginfo->msgnum));
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
 
                                debug_print("Remembering message %d to update...\n", folder_cur_num);
                        } else if (msginfo) {
@@ -2318,7 +2319,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
        }
        
        for(cache_list_cur = cache_list; cache_list_cur != NULL; cache_list_cur = g_slist_next(cache_list_cur))
-               procmsg_msginfo_free((MsgInfo *) cache_list_cur->data);
+               procmsg_msginfo_free((MsgInfo **)&(cache_list_cur->data));
 
        g_slist_free(cache_list);
        g_slist_free(folder_list);
@@ -2373,7 +2374,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
                        if (to_filter != NULL) {
                                for (elem = to_filter; elem; elem = g_slist_next(elem)) {
                                        MsgInfo *msginfo = (MsgInfo *)elem->data;
-                                       procmsg_msginfo_free(msginfo);
+                                       procmsg_msginfo_free(&msginfo);
                                }
                                g_slist_free(to_filter);
                        }
@@ -2450,7 +2451,7 @@ gint folder_item_scan_full(FolderItem *item, gboolean filtering)
 
                totalcnt++;
 
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
        folder_item_set_batch(item, FALSE);
        g_slist_free(exists_list);
@@ -2900,7 +2901,7 @@ gchar *folder_item_fetch_msg(FolderItem *item, gint num)
                                procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED);
                        }
                }
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
 
        return msgfile;
@@ -2947,7 +2948,7 @@ gchar *folder_item_fetch_msg_full(FolderItem *item, gint num, gboolean headers,
                                procmsg_msginfo_set_flags(msginfo, 0, MSG_SCANNED);
                        }
                }
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
 
        return msgfile;
@@ -2994,7 +2995,7 @@ static gint folder_item_get_msg_num_by_file(FolderItem *dest, const gchar *file)
                remove_space(hentry[0].body);
                if ((msginfo = msgcache_get_msg_by_id(dest->cache, hentry[0].body)) != NULL) {
                        msgnum = msginfo->msgnum;
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
 
                        debug_print("found message as uid %d\n", msgnum);
                }
@@ -3219,10 +3220,10 @@ gint folder_item_add_msgs(FolderItem *dest, GSList *file_list,
                        if (!folderscan && 
                            ((newmsginfo = get_msginfo(dest, num)) != NULL)) {
                                add_msginfo_to_cache(dest, newmsginfo, NULL);
-                               procmsg_msginfo_free(newmsginfo);
+                               procmsg_msginfo_free(&newmsginfo);
                        } else if ((newmsginfo = msgcache_get_msg(dest->cache, num)) != NULL) {
                                /* TODO: set default flags */
-                               procmsg_msginfo_free(newmsginfo);
+                               procmsg_msginfo_free(&newmsginfo);
                        }
                }
        }
@@ -3622,7 +3623,7 @@ static gint do_copy_msgs(FolderItem *dest, GSList *msglist, gboolean remove_sour
                                        hooks_invoke (MAIL_POSTFILTERING_HOOKLIST, newmsginfo);
                                }
                        }
-                       procmsg_msginfo_free(newmsginfo);
+                       procmsg_msginfo_free(&newmsginfo);
 
 
                        if (num > lastnum)
@@ -3731,7 +3732,7 @@ gint folder_item_remove_msg(FolderItem *item, gint num)
 
        msginfo = msgcache_get_msg(item->cache, num);
        if (msginfo && MSG_IS_LOCKED(msginfo->flags)) {
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
                return -1;
        }
        ret = folder->klass->remove_msg(folder, item, num);
@@ -3740,7 +3741,7 @@ gint folder_item_remove_msg(FolderItem *item, gint num)
                if (msginfo != NULL) {
                        if (ret == 0)
                                remove_msginfo_from_cache(item, msginfo);
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                }
        }
 
@@ -4463,8 +4464,7 @@ void folder_item_apply_processing(FolderItem *item)
            || post_global_processing)
                filtering_move_and_copy_msgs(mlist);
        for (cur = mlist ; cur != NULL ; cur = cur->next) {
-               MsgInfo * msginfo = (MsgInfo *)cur->data;
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free((MsgInfo **)&(cur->data));
        }
        g_slist_free(mlist);
        
index cd1735a..0a27229 100644 (file)
@@ -108,7 +108,7 @@ gint folderutils_delete_duplicates(FolderItem *item,
        for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
                MsgInfo *msginfo = (MsgInfo *) cur->data;
 
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
        g_slist_free(msglist);
 
@@ -149,7 +149,7 @@ void folderutils_mark_all_read(FolderItem *item)
                                m++;
                        }
                        i++;
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                }
                folder_item_set_batch(item, FALSE);
                folder_item_close(item);
index 96c7c3f..60c8e31 100644 (file)
@@ -1540,7 +1540,7 @@ static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid,
                                                        have_size, cached->size);
                                        procmsg_msginfo_set_flags(cached, MSG_FULLY_CACHED, 0);
                                }
-                               procmsg_msginfo_free(cached);
+                               procmsg_msginfo_free(&cached);
                                return filename;
                        } else if (!cached && time(NULL) - get_file_mtime(filename) < 60) {
                                debug_print("message not cached and file recent, considering file complete\n");
@@ -1548,18 +1548,18 @@ static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid,
                                if (ok == 0)
                                        return filename;
                        } else {
-                               procmsg_msginfo_free(cached);
+                               procmsg_msginfo_free(&cached);
                        }
                }
                if (cached && MSG_IS_FULLY_CACHED(cached->flags)) {
-                       procmsg_msginfo_free(cached);
+                       procmsg_msginfo_free(&cached);
                        return filename;
                }
        } else {
                MsgInfo *cached = msgcache_get_msg(item->cache,uid);
                if (cached) {
                        procmsg_msginfo_unset_flags(cached, MSG_FULLY_CACHED, 0);
-                       procmsg_msginfo_free(cached);
+                       procmsg_msginfo_free(&cached);
                }
        }
 
@@ -1602,13 +1602,13 @@ static gchar *imap_fetch_msg_full(Folder *folder, FolderItem *item, gint uid,
                MsgInfo *cached = msgcache_get_msg(item->cache,uid);
                if (cached) {
                        procmsg_msginfo_set_flags(cached, MSG_FULLY_CACHED, 0);
-                       procmsg_msginfo_free(cached);
+                       procmsg_msginfo_free(&cached);
                }
        } else if (ok == -1) {
                MsgInfo *cached = msgcache_get_msg(item->cache,uid);
                if (cached) {
                        procmsg_msginfo_unset_flags(cached, MSG_FULLY_CACHED, 0);
-                       procmsg_msginfo_free(cached);
+                       procmsg_msginfo_free(&cached);
                }
        }
        return filename;
@@ -1624,7 +1624,7 @@ static gboolean imap_is_msg_fully_cached(Folder *folder, FolderItem *item, gint
                return FALSE;
 
        if (MSG_IS_FULLY_CACHED(cached->flags)) {
-               procmsg_msginfo_free(cached);
+               procmsg_msginfo_free(&cached);
                return TRUE;
        }
 
@@ -1644,11 +1644,11 @@ static gboolean imap_is_msg_fully_cached(Folder *folder, FolderItem *item, gint
        if (cached && size >= cached->size) {
                cached->total_size = cached->size;
                procmsg_msginfo_set_flags(cached, MSG_FULLY_CACHED, 0);
-               procmsg_msginfo_free(cached);
+               procmsg_msginfo_free(&cached);
                return TRUE;
        }
        if (cached)
-               procmsg_msginfo_free(cached);
+               procmsg_msginfo_free(&cached);
        return FALSE;   
 }
 
@@ -5407,7 +5407,7 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
                data->full_search = TRUE;
        
        for (cur = tmp; cur; cur = cur->next)
-               procmsg_msginfo_free((MsgInfo *)cur->data);
+               procmsg_msginfo_free((MsgInfo **)&(cur->data));
        
        g_slist_free(tmp);
 
index ebf2cc3..7714562 100644 (file)
--- a/src/inc.c
+++ b/src/inc.c
@@ -717,7 +717,7 @@ static gint inc_start(IncProgressDialog *inc_dialog)
                for(msglist_element = msglist; msglist_element != NULL; 
                    msglist_element = msglist_element->next) {
                        MsgInfo *msginfo = (MsgInfo *)msglist_element->data;
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free((MsgInfo**)&(msglist_element->data));
                }
                folder_item_update_thaw();
                
index 07e89d6..6f8c19b 100644 (file)
@@ -4833,7 +4833,7 @@ static void prev_history_cb(GtkAction *action, gpointer data)
                        folderview_select(mainwin->folderview, info->folder);
                summary_display_by_msgnum(mainwin->summaryview, info->msgnum);
                summary_display_msg_selected(mainwin->summaryview, FALSE);
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                main_window_set_menu_sensitive(mainwindow_get_mainwindow());
                toolbar_main_set_sensitive(mainwindow_get_mainwindow());
        }
@@ -4847,7 +4847,7 @@ static void next_history_cb(GtkAction *action, gpointer data)
                if (info->folder != mainwin->summaryview->folder_item)
                        folderview_select(mainwin->folderview, info->folder);
                summary_display_by_msgnum(mainwin->summaryview, info->msgnum);
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                main_window_set_menu_sensitive(mainwindow_get_mainwindow());
                toolbar_main_set_sensitive(mainwindow_get_mainwindow());
        }
@@ -5392,7 +5392,7 @@ void mainwindow_jump_to(const gchar *target, gboolean popup)
                                if (popup)
                                        main_window_popup(mainwin);
                                g_free(tmp);
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                                return;
                        } else {
                                g_print("'%s' not found\n", msg);
index 95f1bd7..6b8ad38 100644 (file)
@@ -278,7 +278,7 @@ gint proc_mbox(FolderItem *dest, const gchar *mbox, gboolean apply_filter,
                filtering_move_and_copy_msgs(to_filter);
                for (cur = filtered; cur; cur = g_slist_next(cur)) {
                        MsgInfo *info = (MsgInfo *)cur->data;
-                       procmsg_msginfo_free(info);
+                       procmsg_msginfo_free(&info);
                }
 
                unfiltered = g_slist_reverse(unfiltered);
@@ -286,7 +286,7 @@ gint proc_mbox(FolderItem *dest, const gchar *mbox, gboolean apply_filter,
                        folder_item_move_msgs(dest, unfiltered);
                        for (cur = unfiltered; cur; cur = g_slist_next(cur)) {
                                MsgInfo *info = (MsgInfo *)cur->data;
-                               procmsg_msginfo_free(info);
+                               procmsg_msginfo_free(&info);
                        }
                }
 
index 1329df6..8a164ee 100644 (file)
@@ -1370,7 +1370,7 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
        }
                        
        if (messageview->msginfo != msginfo) {
-               procmsg_msginfo_free(messageview->msginfo);
+               procmsg_msginfo_free(&(messageview->msginfo));
                messageview->msginfo = NULL;
                messageview_set_menu_sensitive(messageview);
                messageview->msginfo = 
@@ -1581,7 +1581,7 @@ void messageview_clear(MessageView *messageview)
 {
        if (!messageview)
                return;
-       procmsg_msginfo_free(messageview->msginfo);
+       procmsg_msginfo_free(&(messageview->msginfo));
        messageview->msginfo = NULL;
        messageview->filtered = FALSE;
 
@@ -1633,7 +1633,7 @@ void messageview_destroy(MessageView *messageview)
        mimeview_destroy(messageview->mimeview);
        noticeview_destroy(messageview->noticeview);
 
-       procmsg_msginfo_free(messageview->msginfo);
+       procmsg_msginfo_free(&(messageview->msginfo));
        toolbar_clear_list(TOOLBAR_MSGVIEW);
        if (messageview->toolbar) {
                toolbar_destroy(messageview->toolbar);
@@ -1978,7 +1978,7 @@ static void return_receipt_send_clicked(NoticeView *noticeview, MsgInfo *msginfo
                noticeview_hide(noticeview);
        }               
 
-       procmsg_msginfo_free(tmpmsginfo);
+       procmsg_msginfo_free(&tmpmsginfo);
        g_free(file);
 }
 
@@ -2554,7 +2554,7 @@ static void prev_history_cb(GtkAction *action, gpointer data)
                messageview_show(messageview, info, 
                                         messageview->all_headers);
                messageview->updating = FALSE;
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                if (messageview->deferred_destroy) {
                        debug_print("messageview got away!\n");
                        messageview_destroy(messageview);
@@ -2572,7 +2572,7 @@ static void next_history_cb(GtkAction *action, gpointer data)
                messageview_show(messageview, info, 
                                         messageview->all_headers);
                messageview->updating = FALSE;
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                if (messageview->deferred_destroy) {
                        debug_print("messageview got away!\n");
                        messageview_destroy(messageview);
@@ -2748,7 +2748,7 @@ static void show_all_header_cb(GtkToggleAction *action, gpointer data)
        if (!msginfo) return;
        messageview->msginfo = NULL;
        messageview_show(messageview, msginfo, messageview->all_headers);
-       procmsg_msginfo_free(msginfo);
+       procmsg_msginfo_free(&msginfo);
        main_window_set_menu_sensitive(messageview->mainwin);
        summary_redisplay_msg(messageview->mainwin->summaryview);
 }
@@ -2780,7 +2780,7 @@ static void msg_hide_quotes_cb(GtkToggleAction *action, gpointer data)
        messageview->msginfo = NULL;
        messageview_show(messageview, msginfo,
                         messageview->all_headers);
-       procmsg_msginfo_free(msginfo);
+       procmsg_msginfo_free(&msginfo);
        
        /* update main window */
        main_window_set_menu_sensitive(messageview->mainwin);
@@ -2869,7 +2869,7 @@ static void add_address_cb(GtkAction *action, gpointer data)
        avatarr = avatars_avatarrender_new(full_msginfo);
        hooks_invoke(AVATAR_IMAGE_RENDER_HOOKLIST, avatarr);
 
-       procmsg_msginfo_free(full_msginfo);
+       procmsg_msginfo_free(&full_msginfo);
 
        if (avatarr->image != NULL)
                picture = gtk_image_get_pixbuf(GTK_IMAGE(avatarr->image));
index e46024f..dbf250c 100644 (file)
--- a/src/mh.c
+++ b/src/mh.c
@@ -930,7 +930,7 @@ static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
                MsgInfo *info = folder_item_get_msginfo(parent, to_number(name));
                if (info != NULL) {
                        gboolean ok = mh_renumber_msg(info);
-                       procmsg_msginfo_free(info);
+                       procmsg_msginfo_free(&info);
                        if (!ok) {
                                g_free(fullpath);
                                return NULL;
index ba29213..edaa092 100644 (file)
@@ -140,7 +140,7 @@ MsgCache *msgcache_new(void)
 
 static gboolean msgcache_msginfo_free_func(gpointer num, gpointer msginfo, gpointer user_data)
 {
-       procmsg_msginfo_free((MsgInfo *)msginfo);
+       procmsg_msginfo_free((MsgInfo **)&msginfo);
        return TRUE;
 }                                                                                        
 
@@ -190,7 +190,7 @@ void msgcache_remove_msg(MsgCache *cache, guint msgnum)
 
        msginfo->folder->cache_dirty = TRUE;
 
-       procmsg_msginfo_free(msginfo);
+       procmsg_msginfo_free(&msginfo);
        cache->last_access = time(NULL);
 
 
@@ -210,7 +210,7 @@ void msgcache_update_msg(MsgCache *cache, MsgInfo *msginfo)
        if (oldmsginfo) {
                g_hash_table_remove(cache->msgnum_table, &oldmsginfo->msgnum);
                cache->memusage -= procmsg_msginfo_memusage(oldmsginfo);
-               procmsg_msginfo_free(oldmsginfo);
+               procmsg_msginfo_free(&oldmsginfo);
        }
 
        newmsginfo = procmsg_msginfo_new_ref(msginfo);
@@ -299,7 +299,7 @@ gint msgcache_get_memory_usage(MsgCache *cache)
 #define READ_CACHE_DATA(data, fp, total_len) \
 { \
        if ((tmp_len = msgcache_read_cache_data_str(fp, &data, conv)) < 0) { \
-               procmsg_msginfo_free(msginfo); \
+               procmsg_msginfo_free(&msginfo); \
                error = TRUE; \
                goto bail_err; \
        } \
@@ -314,7 +314,7 @@ gint msgcache_get_memory_usage(MsgCache *cache)
        if ((ni = fread(&idata, sizeof(idata), 1, fp)) != 1) { \
                g_warning("read_int: Cache data corrupted, read %zd of %zd at " \
                          "offset %ld", ni, sizeof(idata), ftell(fp)); \
-               procmsg_msginfo_free(msginfo); \
+               procmsg_msginfo_free(&msginfo); \
                error = TRUE; \
                goto bail_err; \
        } else \
@@ -342,7 +342,7 @@ gint msgcache_get_memory_usage(MsgCache *cache)
        }                                                                                       \
        if ((tmp_len = msgcache_get_cache_data_str(walk_data, &data, tmp_len, conv)) < 0) { \
                g_print("error at rem_len:%d\n", rem_len);\
-               procmsg_msginfo_free(msginfo); \
+               procmsg_msginfo_free(&msginfo); \
                error = TRUE; \
                goto bail_err; \
        } \
index 8a385b6..5694b0d 100644 (file)
@@ -328,7 +328,7 @@ static int partial_uidl_mark_mail(MsgInfo *msginfo, int download)
        err = 0;
 bail:
        g_free(filename);
-       procmsg_msginfo_free(tinfo);
+       procmsg_msginfo_free(&tinfo);
        
        return err;
 }
index 4711f4f..c1cec12 100644 (file)
@@ -116,7 +116,7 @@ static gint save_new_message(MsgInfo *oldmsg, MsgInfo *newmsg, MimeInfo *info,
        
        finalmsg = procmsg_msginfo_new_from_mimeinfo(newmsg, info);
        if (!finalmsg) {
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
                return -1;
        }
 
@@ -133,14 +133,14 @@ static gint save_new_message(MsgInfo *oldmsg, MsgInfo *newmsg, MimeInfo *info,
        msgnum = folder_item_add_msg(item, finalmsg->plaintext_file, 
                        &flags, TRUE);
        finalmsg->msgnum = msgnum;
-       procmsg_msginfo_free(newmsg);
-       procmsg_msginfo_free(finalmsg);
+       procmsg_msginfo_free(&newmsg);
+       procmsg_msginfo_free(&finalmsg);
                
        newmsg = folder_item_get_msginfo(item, msgnum);
        if (newmsg && item) {
                procmsg_msginfo_unset_flags(newmsg, ~0, ~0);
                procmsg_msginfo_set_flags(newmsg, flags.perm_flags, flags.tmp_flags);
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
        }
        
        return msgnum;
@@ -168,7 +168,7 @@ static void remove_attachments_cb(GtkWidget *widget, AttRemover *attremover)
        partinfo = procmime_mimeinfo_next(partinfo);
        if (!partinfo || !gtk_tree_model_get_iter_first(model, &iter)) {
                gtk_widget_destroy(attremover->window);
-               procmsg_msginfo_free(newmsg);
+               procmsg_msginfo_free(&newmsg);
                return;
        }
 
@@ -440,7 +440,7 @@ static void remove_attachments(GSList *msglist)
                info = procmime_scan_message(newmsg);
        
                if ( !(partinfo = find_first_text_part(info)) ) {
-                       procmsg_msginfo_free(newmsg);
+                       procmsg_msginfo_free(&newmsg);
                        continue;
                }
                partinfo->node->next = NULL;
index e627c29..ad1e80d 100644 (file)
@@ -209,7 +209,7 @@ void vcal_view_select_event (const gchar *uid, FolderItem *item, gboolean edit,
                                               G_CALLBACK(block_cb), block_data);
                           summary_select_by_msgnum(summaryview, info->msgnum);
                           summary_display_msg_selected(summaryview, FALSE);
-                          procmsg_msginfo_free(info);
+                          procmsg_msginfo_free(&info);
                           g_signal_handlers_unblock_by_func(G_OBJECT(summaryview->ctree),
                                               G_CALLBACK(block_cb), block_data);
                   }
index 266f486..c52a399 100644 (file)
@@ -1053,7 +1053,7 @@ static gint vcal_remove_msg(Folder *folder, FolderItem *_item, gint num)
        if (_item == folder->inbox)
                vcal_remove_event(folder, msginfo);
 
-       procmsg_msginfo_free(msginfo);
+       procmsg_msginfo_free(&msginfo);
        return 0;
 }
 
@@ -2417,7 +2417,7 @@ gboolean vcal_event_exists(const gchar *id)
 
        info = folder_item_get_msginfo_by_msgid(folder->inbox, id);
        if (info != NULL) {
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                return TRUE;
        }
        return FALSE;
@@ -2455,7 +2455,7 @@ gboolean vcal_delete_event(const gchar *id)
        if (info != NULL) {
                debug_print("removing event %s\n", id);
                vcal_remove_event(folder, info);
-               procmsg_msginfo_free(info);
+               procmsg_msginfo_free(&info);
                folder_item_scan(folder->inbox);
                return TRUE;
        }
index 2a924e4..a47f862 100644 (file)
@@ -217,7 +217,7 @@ bail:
                        g_free(url);
                }
 
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
 
        statusbar_progress_all(0,0,0);
index cce1695..bcb3db2 100644 (file)
@@ -1584,7 +1584,7 @@ static void procmime_parse_disposition_notification(MimeInfo *mimeinfo,
                        debug_print("%s %s in %s\n", info?"found":"didn't find", orig_msg_id, outbox->path);
                        if (info) {
                                procmsg_msginfo_set_flags(info, MSG_RETRCPT_GOT, 0);
-                               procmsg_msginfo_free(info);
+                               procmsg_msginfo_free(&info);
                        }
                }
        }
index 9fb33a2..d47ebaf 100644 (file)
@@ -84,7 +84,7 @@ void procmsg_msg_list_free(GSList *mlist)
 
        for (cur = mlist; cur != NULL; cur = cur->next) {
                msginfo = (MsgInfo *)cur->data;
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
        g_slist_free(mlist);
 }
@@ -469,7 +469,7 @@ void procmsg_message_file_list_free(MsgInfoList *file_list)
 
        for (cur = file_list; cur != NULL; cur = cur->next) {
                fileinfo = (MsgFileInfo *)cur->data;
-               procmsg_msginfo_free(fileinfo->msginfo);
+               procmsg_msginfo_free(&(fileinfo->msginfo));
                g_free(fileinfo->file);
                g_free(fileinfo->flags);
                g_free(fileinfo);
@@ -680,14 +680,14 @@ static void procmsg_empty_trash(FolderItem *trash)
                for (cur = mlist ; cur != NULL ; cur = cur->next) {
                        MsgInfo * msginfo = (MsgInfo *) cur->data;
                        if (MSG_IS_LOCKED(msginfo->flags)) {
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                                continue;
                        }
                        if (msginfo->total_size != 0 && 
                            msginfo->size != (off_t)msginfo->total_size)
                                partial_mark_for_delete(msginfo);
 
-                       procmsg_msginfo_free(msginfo);
+                       procmsg_msginfo_free(&msginfo);
                }
                g_slist_free(mlist);
                folder_item_remove_all_msg(trash);
@@ -1014,7 +1014,7 @@ gint procmsg_send_queue(FolderItem *queue, gboolean save_msgs, gchar **errstr)
                /* FIXME: supposedly if only one message is locked, and queue
                 * is being flushed, the following free says something like 
                 * "freeing msg ## in folder (nil)". */
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
        }
 
        g_slist_free(sorted_list);
@@ -1169,14 +1169,14 @@ gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
        tmp_msginfo = procmsg_msginfo_get_full_info(msginfo);   /* refcnt++ */ 
        if (msginfo != NULL) {
                procmsg_msginfo_unset_flags(msginfo, ~0, 0);
-               procmsg_msginfo_free(msginfo);                  /* refcnt-- */
+               procmsg_msginfo_free(&msginfo);                 /* refcnt-- */
                /* tmp_msginfo == msginfo */
                if (tmp_msginfo && msginfo->extradata && 
                    (msginfo->extradata->dispositionnotificationto || 
                     msginfo->extradata->returnreceiptto)) {
                        procmsg_msginfo_set_flags(msginfo, MSG_RETRCPT_SENT, 0); 
                }       
-               procmsg_msginfo_free(tmp_msginfo);              /* refcnt-- */
+               procmsg_msginfo_free(&tmp_msginfo);             /* refcnt-- */
        }
 
        return 0;
@@ -1346,7 +1346,7 @@ MsgInfo *procmsg_msginfo_get_full_info_from_file(MsgInfo *msginfo, const gchar *
                        msginfo->extradata->resent_from = g_strdup
                                (full_msginfo->extradata->resent_from);
        }
-       procmsg_msginfo_free(full_msginfo);
+       procmsg_msginfo_free(&full_msginfo);
 
        return procmsg_msginfo_new_ref(msginfo);
 }
@@ -1373,8 +1373,11 @@ MsgInfo *procmsg_msginfo_get_full_info(MsgInfo *msginfo)
        return full_msginfo;
 }
 
-void procmsg_msginfo_free(MsgInfo *msginfo)
+#define FREENULL(n) { g_free(n); n = NULL; }
+void procmsg_msginfo_free(MsgInfo **msginfo_ptr)
 {
+       MsgInfo *msginfo = *msginfo_ptr;
+
        if (msginfo == NULL) return;
 
        msginfo->refcnt--;
@@ -1386,19 +1389,19 @@ void procmsg_msginfo_free(MsgInfo *msginfo)
                folder_item_update(msginfo->to_folder, F_ITEM_UPDATE_MSGCNT);
        }
 
-       g_free(msginfo->fromspace);
+       FREENULL(msginfo->fromspace);
 
-       g_free(msginfo->fromname);
+       FREENULL(msginfo->fromname);
 
-       g_free(msginfo->date);
-       g_free(msginfo->from);
-       g_free(msginfo->to);
-       g_free(msginfo->cc);
-       g_free(msginfo->newsgroups);
-       g_free(msginfo->subject);
-       g_free(msginfo->msgid);
-       g_free(msginfo->inreplyto);
-       g_free(msginfo->xref);
+       FREENULL(msginfo->date);
+       FREENULL(msginfo->from);
+       FREENULL(msginfo->to);
+       FREENULL(msginfo->cc);
+       FREENULL(msginfo->newsgroups);
+       FREENULL(msginfo->subject);
+       FREENULL(msginfo->msgid);
+       FREENULL(msginfo->inreplyto);
+       FREENULL(msginfo->xref);
 
        if (msginfo->extradata) {
                if (msginfo->extradata->avatars) {
@@ -1407,27 +1410,28 @@ void procmsg_msginfo_free(MsgInfo *msginfo)
                                        NULL);
                        g_slist_free(msginfo->extradata->avatars);
                }
-               g_free(msginfo->extradata->returnreceiptto);
-               g_free(msginfo->extradata->dispositionnotificationto);
-               g_free(msginfo->extradata->list_post);
-               g_free(msginfo->extradata->list_subscribe);
-               g_free(msginfo->extradata->list_unsubscribe);
-               g_free(msginfo->extradata->list_help);
-               g_free(msginfo->extradata->list_archive);
-               g_free(msginfo->extradata->list_owner);
-               g_free(msginfo->extradata->partial_recv);
-               g_free(msginfo->extradata->account_server);
-               g_free(msginfo->extradata->account_login);
-               g_free(msginfo->extradata->resent_from);
-               g_free(msginfo->extradata);
+               FREENULL(msginfo->extradata->returnreceiptto);
+               FREENULL(msginfo->extradata->dispositionnotificationto);
+               FREENULL(msginfo->extradata->list_post);
+               FREENULL(msginfo->extradata->list_subscribe);
+               FREENULL(msginfo->extradata->list_unsubscribe);
+               FREENULL(msginfo->extradata->list_help);
+               FREENULL(msginfo->extradata->list_archive);
+               FREENULL(msginfo->extradata->list_owner);
+               FREENULL(msginfo->extradata->partial_recv);
+               FREENULL(msginfo->extradata->account_server);
+               FREENULL(msginfo->extradata->account_login);
+               FREENULL(msginfo->extradata->resent_from);
+               FREENULL(msginfo->extradata);
        }
        slist_free_strings_full(msginfo->references);
        g_slist_free(msginfo->tags);
 
-       g_free(msginfo->plaintext_file);
+       FREENULL(msginfo->plaintext_file);
 
-       g_free(msginfo);
+       FREENULL(msginfo);
 }
+#undef FREENULL
 
 guint procmsg_msginfo_memusage(MsgInfo *msginfo)
 {
@@ -1751,7 +1755,7 @@ send_mail:
                                        debug_print("copied queued mail %d to sent folder\n", msgnum);
                                        saved = TRUE;
                                }
-                               procmsg_msginfo_free(queued_mail);
+                               procmsg_msginfo_free(&queued_mail);
                        }
                        if (!saved) {
                                debug_print("resaving queued mail to sent folder\n");
@@ -1780,7 +1784,7 @@ send_mail:
                        if ((msginfo != NULL) && 
                            (msginfo->msgid != NULL) &&
                            (strcmp(msginfo->msgid, tokens[2]) != 0)) {
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                                msginfo = NULL;
                        }
                        
@@ -1800,7 +1804,7 @@ send_mail:
                                }  else {
                                        procmsg_msginfo_set_flags(msginfo, MSG_FORWARDED, 0);
                                }
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                        }
                }
                g_strfreev(tokens);
@@ -2059,7 +2063,7 @@ static gboolean procmsg_msg_has_flagged_parent_real(MsgInfo *info,
                tmp = folder_item_get_msginfo_by_msgid(info->folder,
                                info->inreplyto);
                if (tmp && (tmp->flags.perm_flags & perm_flags)) {
-                       procmsg_msginfo_free(tmp);
+                       procmsg_msginfo_free(&tmp);
                        return TRUE;
                } else if (tmp != NULL) {
                        gboolean result;
@@ -2073,7 +2077,7 @@ static gboolean procmsg_msg_has_flagged_parent_real(MsgInfo *info,
                                result = procmsg_msg_has_flagged_parent_real(
                                    tmp, perm_flags, parentmsgs);
                        }
-                       procmsg_msginfo_free(tmp);
+                       procmsg_msginfo_free(&tmp);
                        return result;
                } else {
                        return FALSE;
@@ -2158,7 +2162,7 @@ static GSList *procmsg_find_children (MsgInfo *info)
                for (cur = all; cur != NULL; cur = g_slist_next(cur)) {
                        /* this will not free the used pointers
                           created with procmsg_msginfo_new_ref */
-                       procmsg_msginfo_free((MsgInfo *)cur->data);
+                       procmsg_msginfo_free((MsgInfo **)&(cur->data));
                }
        }
        g_slist_free(all);
@@ -2179,7 +2183,7 @@ static void procmsg_update_unread_children(MsgInfo *info, gboolean newly_marked)
                                info->folder->unreadmarked_msgs--;
                        folder_item_update(info->folder, F_ITEM_UPDATE_MSGCNT);
                }
-               procmsg_msginfo_free(tmp);
+               procmsg_msginfo_free(&tmp);
        }
        g_slist_free(children);
 }
index 5152c05..9b143f1 100644 (file)
@@ -342,7 +342,7 @@ MsgInfo *procmsg_msginfo_get_full_info      (MsgInfo        *msginfo);
 MsgInfo *procmsg_msginfo_get_full_info_from_file
                                        (MsgInfo *msginfo, 
                                        const gchar *file);
-void    procmsg_msginfo_free           (MsgInfo        *msginfo);
+void    procmsg_msginfo_free           (MsgInfo        **msginfo);
 guint   procmsg_msginfo_memusage       (MsgInfo        *msginfo);
 
 gint procmsg_send_message_queue_with_lock(const gchar *file,
index be2733d..18f7f3a 100644 (file)
@@ -251,7 +251,7 @@ gint send_message_smtp_full(PrefsAccount *ac_prefs, GSList *to_list, FILE *fp, g
                strncpy2(spec_from, ac_prefs->address, BUFFSIZE-1);
        }
        if (tmp_msginfo) {
-               procmsg_msginfo_free(tmp_msginfo);
+               procmsg_msginfo_free(&tmp_msginfo);
        }
 
        if (!ac_prefs->session) {
index e1914cf..df0986e 100644 (file)
@@ -1408,7 +1408,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        
                        if (!msginfo->hidden) {
                                if (MSG_IS_DELETED(msginfo->flags) && summaryview->folder_item->hide_del_msgs) {
-                                       procmsg_msginfo_free(msginfo);
+                                       procmsg_msginfo_free(&msginfo);
                                        continue;
                                }
                                if (summaryview->folder_item->hide_read_msgs) {
@@ -1423,12 +1423,12 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                                                 msginfo->msgnum == displayed_msgnum))
                                                not_killed = g_slist_prepend(not_killed, msginfo);
                                        else
-                                               procmsg_msginfo_free(msginfo);
+                                               procmsg_msginfo_free(&msginfo);
                                } else {
                                        not_killed = g_slist_prepend(not_killed, msginfo);
                                }
                         } else
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                }
                hidden_removed = TRUE;
                g_slist_free(mlist);
@@ -1451,7 +1451,7 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item)
                        if (!msginfo->hidden)
                                not_killed = g_slist_prepend(not_killed, msginfo);
                        else
-                               procmsg_msginfo_free(msginfo);
+                               procmsg_msginfo_free(&msginfo);
                }
                g_slist_free(mlist);
                mlist = not_killed;
@@ -2499,7 +2499,7 @@ static void summary_free_msginfo_func(GtkCMCTree *ctree, GtkCMCTreeNode *node,
        MsgInfo *msginfo = gtk_cmctree_node_get_row_data(ctree, node);
 
        if (msginfo)
-               procmsg_msginfo_free(msginfo);
+               procmsg_msginfo_free(&msginfo);
 }
 
 static void summary_set_marks_func(GtkCMCTree *ctree, GtkCMCTreeNode *node,
@@ -3563,7 +3563,7 @@ static int msginfo_mark_as_read_timeout(void *data)
        if (mdata->msginfo == summary_get_selected_msg(mdata->summaryview))
                msginfo_mark_as_read(mdata->summaryview, mdata->msginfo,
                                     mdata->summaryview->selected);
-       procmsg_msginfo_free(mdata->msginfo);
+       procmsg_msginfo_free(&(mdata->msginfo));
 
        mdata->summaryview->mark_as_read_timeout_tag = 0;
        summary_unlock(mdata->summaryview);
@@ -4733,7 +4733,7 @@ void summary_add_address(SummaryView *summaryview)
        avatarr = avatars_avatarrender_new(full_msginfo);
        hooks_invoke(AVATAR_IMAGE_RENDER_HOOKLIST, avatarr);
 
-       procmsg_msginfo_free(full_msginfo);
+       procmsg_msginfo_free(&full_msginfo);
 
        if (avatarr->image)
                picture = gtk_image_get_pixbuf(GTK_IMAGE(avatarr->image));
@@ -5161,7 +5161,7 @@ static gint summary_execute_move(SummaryView *summaryview)
 
                if (!summaryview->folder_item->folder->account || summaryview->folder_item->folder->account->imap_use_trash) {
                        for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
-                               procmsg_msginfo_free((MsgInfo *)cur->data);
+                               procmsg_msginfo_free((MsgInfo **)&(cur->data));
                } 
                if (summaryview->folder_item->folder->account && !summaryview->folder_item->folder->account->imap_use_trash) {
                        gtk_cmctree_pre_recursive(ctree, NULL, summary_set_deleted_func,
@@ -5267,7 +5267,7 @@ static void summary_execute_delete(SummaryView *summaryview)
                        summary_update_msg, (gpointer) summaryview);
        if (!summaryview->folder_item->folder->account || summaryview->folder_item->folder->account->imap_use_trash) {
                for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
-                       procmsg_msginfo_free((MsgInfo *)cur->data);
+                       procmsg_msginfo_free((MsgInfo **)&(cur->data));
        }
        g_slist_free(summaryview->mlist);
        summaryview->mlist = NULL;
@@ -5348,7 +5348,7 @@ static void summary_execute_expunge(SummaryView *summaryview)
                hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, 
                        summary_update_msg, (gpointer) summaryview);
        for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
-               procmsg_msginfo_free((MsgInfo *)cur->data);
+               procmsg_msginfo_free((MsgInfo **)&(cur->data));
 
        g_slist_free(summaryview->mlist);
        summaryview->mlist = NULL;
@@ -5710,7 +5710,7 @@ void summary_filter(SummaryView *summaryview, gboolean selected_only)
        filtering_move_and_copy_msgs(mlist);
        
        for (cur_list = mlist; cur_list; cur_list = cur_list->next) {
-               procmsg_msginfo_free((MsgInfo *)cur_list->data);
+               procmsg_msginfo_free((MsgInfo **)&(cur_list->data));
        }
        g_slist_free(mlist);