From bfb18150efae6fc3eb1c7f436e1ffc86c8e375fa Mon Sep 17 00:00:00 2001 From: Andrej Kacian Date: Sat, 23 Jan 2016 15:40:38 +0100 Subject: [PATCH 1/1] Make procmsg_msginfo_free() zero out pointers to freed memory. 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. --- src/action.c | 2 +- src/compose.c | 32 +++++----- src/folder.c | 34 +++++------ src/folderutils.c | 4 +- src/imap.c | 20 +++--- src/inc.c | 2 +- src/mainwindow.c | 6 +- src/mbox.c | 4 +- src/messageview.c | 18 +++--- src/mh.c | 2 +- src/msgcache.c | 12 ++-- src/partial_download.c | 2 +- src/plugins/att_remover/att_remover.c | 12 ++-- src/plugins/vcalendar/common-views.c | 2 +- src/plugins/vcalendar/vcal_folder.c | 6 +- src/plugins/vcalendar/vcalendar.c | 2 +- src/procmime.c | 2 +- src/procmsg.c | 88 ++++++++++++++------------- src/procmsg.h | 2 +- src/send_message.c | 2 +- src/summaryview.c | 22 +++---- 21 files changed, 140 insertions(+), 136 deletions(-) diff --git a/src/action.c b/src/action.c index 86fd19892..e78bf477b 100644 --- a/src/action.c +++ b/src/action.c @@ -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) diff --git a/src/compose.c b/src/compose.c index 81947e733..af64a8327 100644 --- a/src/compose.c +++ b/src/compose.c @@ -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); diff --git a/src/folder.c b/src/folder.c index 705db3761..f2237ecce 100644 --- a/src/folder.c +++ b/src/folder.c @@ -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); diff --git a/src/folderutils.c b/src/folderutils.c index cd1735a2c..0a272292f 100644 --- a/src/folderutils.c +++ b/src/folderutils.c @@ -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); diff --git a/src/imap.c b/src/imap.c index 96c7c3f3d..60c8e3159 100644 --- a/src/imap.c +++ b/src/imap.c @@ -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); diff --git a/src/inc.c b/src/inc.c index ebf2cc380..7714562aa 100644 --- 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(); diff --git a/src/mainwindow.c b/src/mainwindow.c index 07e89d666..6f8c19b6e 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -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); diff --git a/src/mbox.c b/src/mbox.c index 95f1bd780..6b8ad38b6 100644 --- a/src/mbox.c +++ b/src/mbox.c @@ -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); } } diff --git a/src/messageview.c b/src/messageview.c index 1329df647..8a164eeb2 100644 --- a/src/messageview.c +++ b/src/messageview.c @@ -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)); diff --git a/src/mh.c b/src/mh.c index e46024f49..dbf250c37 100644 --- 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; diff --git a/src/msgcache.c b/src/msgcache.c index ba292132e..edaa0924c 100644 --- a/src/msgcache.c +++ b/src/msgcache.c @@ -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; \ } \ diff --git a/src/partial_download.c b/src/partial_download.c index 8a385b6f4..5694b0d8e 100644 --- a/src/partial_download.c +++ b/src/partial_download.c @@ -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; } diff --git a/src/plugins/att_remover/att_remover.c b/src/plugins/att_remover/att_remover.c index 4711f4fd2..c1cec1215 100644 --- a/src/plugins/att_remover/att_remover.c +++ b/src/plugins/att_remover/att_remover.c @@ -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; diff --git a/src/plugins/vcalendar/common-views.c b/src/plugins/vcalendar/common-views.c index e627c29dc..ad1e80d97 100644 --- a/src/plugins/vcalendar/common-views.c +++ b/src/plugins/vcalendar/common-views.c @@ -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); } diff --git a/src/plugins/vcalendar/vcal_folder.c b/src/plugins/vcalendar/vcal_folder.c index 266f48608..c52a39970 100644 --- a/src/plugins/vcalendar/vcal_folder.c +++ b/src/plugins/vcalendar/vcal_folder.c @@ -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; } diff --git a/src/plugins/vcalendar/vcalendar.c b/src/plugins/vcalendar/vcalendar.c index 2a924e475..a47f86222 100644 --- a/src/plugins/vcalendar/vcalendar.c +++ b/src/plugins/vcalendar/vcalendar.c @@ -217,7 +217,7 @@ bail: g_free(url); } - procmsg_msginfo_free(msginfo); + procmsg_msginfo_free(&msginfo); } statusbar_progress_all(0,0,0); diff --git a/src/procmime.c b/src/procmime.c index cce169580..bcb3db2e3 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -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); } } } diff --git a/src/procmsg.c b/src/procmsg.c index 9fb33a21b..d47ebaf4a 100644 --- a/src/procmsg.c +++ b/src/procmsg.c @@ -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); } diff --git a/src/procmsg.h b/src/procmsg.h index 5152c05bf..9b143f1bf 100644 --- a/src/procmsg.h +++ b/src/procmsg.h @@ -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, diff --git a/src/send_message.c b/src/send_message.c index be2733db0..18f7f3a78 100644 --- a/src/send_message.c +++ b/src/send_message.c @@ -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) { diff --git a/src/summaryview.c b/src/summaryview.c index e1914cf86..df0986e39 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -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); -- 2.25.1