[evolution-data-server] Make sure loaded info is also freed before using camel_folder_summary_remove_uid()



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]