[evolution-data-server] Make sure loaded info is also freed before using camel_folder_summary_remove_uid()
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Make sure loaded info is also freed before using camel_folder_summary_remove_uid()
- Date: Thu, 19 Jul 2012 20:33:20 +0000 (UTC)
commit 31689c17029b259d6edf5ea651ed8ecc04827a33
Author: Milan Crha <mcrha redhat com>
Date: Thu Jul 19 22:30:37 2012 +0200
Make sure loaded info is also freed before using camel_folder_summary_remove_uid()
The problem is that camel_folder_summary_remove_uid() doesn't free loaded
CamelMessageInfo, if there is any, it does only camel_folder_summary_remove(),
thus this might be done on each place, unfortunately.
camel/providers/imap/camel-imap-folder.c | 31 +++++++++++++++++++++++--
camel/providers/local/camel-maildir-folder.c | 3 +-
camel/providers/local/camel-mbox-folder.c | 2 +-
camel/providers/local/camel-mbox-summary.c | 5 ++-
camel/providers/local/camel-mh-folder.c | 3 +-
camel/providers/nntp/camel-nntp-folder.c | 9 ++++++-
camel/providers/nntp/camel-nntp-summary.c | 11 ++++++++-
7 files changed, 52 insertions(+), 12 deletions(-)
---
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index cfbb03e..da8fe8f 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -1896,7 +1896,15 @@ imap_expunge_uids_offline (CamelFolder *folder,
changes = camel_folder_change_info_new ();
for (i = 0; i < uids->len; i++) {
- camel_folder_summary_remove_uid (folder->summary, uids->pdata[i]);
+ CamelMessageInfo *mi = camel_folder_summary_peek_loaded (folder->summary, uids->pdata[i]);
+
+ if (mi) {
+ camel_folder_summary_remove (folder->summary, mi);
+ camel_message_info_free (mi);
+ } else {
+ camel_folder_summary_remove_uid (folder->summary, uids->pdata[i]);
+ }
+
camel_folder_change_info_remove_uid (changes, uids->pdata[i]);
list = g_list_prepend (list, (gpointer) uids->pdata[i]);
/* We intentionally don't remove it from the cache because
@@ -1991,7 +1999,15 @@ imap_expunge_uids_online (CamelFolder *folder,
changes = camel_folder_change_info_new ();
for (i = 0; i < uids->len; i++) {
- camel_folder_summary_remove_uid (folder->summary, uids->pdata[i]);
+ CamelMessageInfo *mi = camel_folder_summary_peek_loaded (folder->summary, uids->pdata[i]);
+
+ if (mi) {
+ camel_folder_summary_remove (folder->summary, mi);
+ camel_message_info_free (mi);
+ } else {
+ camel_folder_summary_remove_uid (folder->summary, uids->pdata[i]);
+ }
+
camel_folder_change_info_remove_uid (changes, uids->pdata[i]);
list = g_list_prepend (list, (gpointer) uids->pdata[i]);
/* We intentionally don't remove it from the cache because
@@ -4311,6 +4327,8 @@ camel_imap_folder_changed (CamelFolder *folder,
known_uids = camel_folder_summary_get_array (folder->summary);
camel_folder_sort_uids (folder, known_uids);
for (i = 0; i < expunged->len; i++) {
+ CamelMessageInfo *mi;
+
id = g_array_index (expunged, int, i);
uid = id - 1 + i >= 0 && id - 1 + i < known_uids->len ? g_ptr_array_index (known_uids, id - 1 + i) : NULL;
if (uid == NULL) {
@@ -4324,7 +4342,14 @@ camel_imap_folder_changed (CamelFolder *folder,
CAMEL_IMAP_FOLDER_REC_LOCK (imap_folder, cache_lock);
camel_imap_message_cache_remove (imap_folder->cache, uid);
CAMEL_IMAP_FOLDER_REC_UNLOCK (imap_folder, cache_lock);
- camel_folder_summary_remove_uid (folder->summary, uid);
+
+ mi = camel_folder_summary_peek_loaded (folder->summary, uid);
+ if (mi) {
+ camel_folder_summary_remove (folder->summary, mi);
+ camel_message_info_free (mi);
+ } else {
+ camel_folder_summary_remove_uid (folder->summary, uid);
+ }
}
/* Delete all in one transaction */
diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c
index f8aadd7..22a7b6e 100644
--- a/camel/providers/local/camel-maildir-folder.c
+++ b/camel/providers/local/camel-maildir-folder.c
@@ -219,8 +219,7 @@ maildir_folder_append_message_sync (CamelFolder *folder,
fail_write:
/* remove the summary info so we are not out-of-sync with the mh folder */
- camel_folder_summary_remove_uid (CAMEL_FOLDER_SUMMARY (folder->summary),
- camel_message_info_uid (mi));
+ camel_folder_summary_remove (CAMEL_FOLDER_SUMMARY (folder->summary), mi);
g_prefix_error (
error, _("Cannot append message to maildir folder: %s: "),
diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c
index 85424bf..29dcef4 100644
--- a/camel/providers/local/camel-mbox-folder.c
+++ b/camel/providers/local/camel-mbox-folder.c
@@ -272,7 +272,7 @@ fail_write:
g_free (fromline);
/* remove the summary info so we are not out-of-sync with the mbox */
- camel_folder_summary_remove_uid (CAMEL_FOLDER_SUMMARY (mbs), camel_message_info_uid (mi));
+ camel_folder_summary_remove (CAMEL_FOLDER_SUMMARY (mbs), mi);
/* and tell the summary it's up-to-date */
if (g_stat (lf->folder_path, &st) == 0) {
diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c
index 2d2065f..6821715 100644
--- a/camel/providers/local/camel-mbox-summary.c
+++ b/camel/providers/local/camel-mbox-summary.c
@@ -514,7 +514,8 @@ summary_update (CamelLocalSummary *cls,
if (changeinfo)
camel_folder_change_info_remove_uid (changeinfo, uid);
del = g_list_prepend (del, (gpointer) camel_pstring_strdup (uid));
- camel_folder_summary_remove_uid (s, uid);
+ if (mi)
+ camel_folder_summary_remove (s, (CamelMessageInfo *) mi);
}
if (mi)
@@ -1135,7 +1136,7 @@ camel_mbox_summary_sync_mbox (CamelMboxSummary *cls,
/* remove it from the change list */
camel_folder_change_info_remove_uid (changeinfo, uid);
- camel_folder_summary_remove_uid (s, uid);
+ camel_folder_summary_remove (s, (CamelMessageInfo *) info);
del = g_list_prepend (del, (gpointer) camel_pstring_strdup (uid));
camel_message_info_free ((CamelMessageInfo *) info);
info = NULL;
diff --git a/camel/providers/local/camel-mh-folder.c b/camel/providers/local/camel-mh-folder.c
index c9caf21..e2ec447 100644
--- a/camel/providers/local/camel-mh-folder.c
+++ b/camel/providers/local/camel-mh-folder.c
@@ -112,8 +112,7 @@ mh_folder_append_message_sync (CamelFolder *folder,
fail_write:
/* remove the summary info so we are not out-of-sync with the mh folder */
- camel_folder_summary_remove_uid (CAMEL_FOLDER_SUMMARY (folder->summary),
- camel_message_info_uid (mi));
+ camel_folder_summary_remove (CAMEL_FOLDER_SUMMARY (folder->summary), mi);
g_prefix_error (
error, _("Cannot append message to mh folder: %s: "), name);
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
index e4e79d7..f7f792c 100644
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ b/camel/providers/nntp/camel-nntp-folder.c
@@ -672,7 +672,14 @@ nntp_folder_expunge_uids_offline (CamelFolder *folder,
changes = camel_folder_change_info_new ();
for (ii = 0; ii < uids->len; ii++) {
- camel_folder_summary_remove_uid (folder->summary, uids->pdata[ii]);
+ CamelMessageInfo *mi = camel_folder_summary_peek_loaded (folder->summary, uids->pdata[ii]);
+ if (mi) {
+ camel_folder_summary_remove (folder->summary, mi);
+ camel_message_info_free (mi);
+ } else {
+ camel_folder_summary_remove_uid (folder->summary, uids->pdata[ii]);
+ }
+
camel_folder_change_info_remove_uid (changes, uids->pdata[ii]);
}
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index 329c0d2..fa7c9ad 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -462,6 +462,8 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
n = strtoul (uid, NULL, 10);
if (n < f || n > l) {
+ CamelMessageInfo *mi;
+
dd (printf ("nntp_summary: %u is lower/higher than lowest/highest article, removed\n", n));
/* Since we use a global cache this could prematurely remove
* a cached message that might be in another folder - not that important as
@@ -471,7 +473,14 @@ camel_nntp_summary_check (CamelNNTPSummary *cns,
camel_data_cache_remove (store->cache, "cache", msgid + 1, NULL);
camel_folder_change_info_remove_uid (changes, uid);
del = g_list_prepend (del, (gpointer) camel_pstring_strdup (uid));
- camel_folder_summary_remove_uid (s, uid);
+
+ mi = camel_folder_summary_peek_loaded (s, uid);
+ if (mi) {
+ camel_folder_summary_remove (s, mi);
+ camel_message_info_free (mi);
+ } else {
+ camel_folder_summary_remove_uid (s, uid);
+ }
}
}
camel_folder_summary_free_array (known_uids);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]