aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@novell.com>2004-05-21 03:16:53 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2004-05-21 03:16:53 +0800
commitbb332fc6a0c1ad636ebc7aeaa0db42deabe19407 (patch)
treefccf544bdb7e2e5fe1e1d82aa962c7ffd39dea2c
parentc976418063aa604997502adb6b88054f0f2822cf (diff)
downloadgsoc2013-evolution-bb332fc6a0c1ad636ebc7aeaa0db42deabe19407.tar.gz
gsoc2013-evolution-bb332fc6a0c1ad636ebc7aeaa0db42deabe19407.tar.zst
gsoc2013-evolution-bb332fc6a0c1ad636ebc7aeaa0db42deabe19407.zip
Fixes bug #42295 and the infinite loop part of bug #58766 (these 2 bugs
2004-05-20 Jeffrey Stedfast <fejj@novell.com> Fixes bug #42295 and the infinite loop part of bug #58766 (these 2 bugs are almost identical, except the server responses are broken in different ways). * providers/imap/camel-imap-folder.c (imap_update_summary): Remove the kludge to re-SELECT the folder to force a re-FETCH of message-info's. This 1) doesn't do what it was meant to do and 2) has a tendency to cause infinite loops with broken servers such as Courier-IMAP. (imap_update_summary): Rework the loop that adds messages to the summary such that if we encounetr an error, we break out and set an exception (we can keep the messages up to the point of failure, but none after that because otherwise our uid-to-seqid mapping would be inconsistant with that of the server and could potentially cause data loss). svn path=/trunk/; revision=26019
-rw-r--r--camel/ChangeLog18
-rw-r--r--camel/providers/imap/camel-imap-folder.c45
2 files changed, 41 insertions, 22 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 2b55f9689e..ddd90a7ddc 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,21 @@
+2004-05-20 Jeffrey Stedfast <fejj@novell.com>
+
+ Fixes bug #42295 and the infinite loop part of bug #58766 (these 2
+ bugs are almost identical, except the server responses are broken
+ in different ways).
+
+ * providers/imap/camel-imap-folder.c (imap_update_summary): Remove
+ the kludge to re-SELECT the folder to force a re-FETCH of
+ message-info's. This 1) doesn't do what it was meant to do and 2)
+ has a tendency to cause infinite loops with broken servers such as
+ Courier-IMAP.
+ (imap_update_summary): Rework the loop that adds messages to the
+ summary such that if we encounetr an error, we break out and set
+ an exception (we can keep the messages up to the point of failure,
+ but none after that because otherwise our uid-to-seqid mapping
+ would be inconsistant with that of the server and could
+ potentially cause data loss).
+
2004-05-20 Not Zed <NotZed@Ximian.com>
* providers/nntp/camel-nntp-folder.c (nntp_folder_get_message):
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index b75373a375..d2da841599 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -2459,19 +2459,33 @@ imap_update_summary (CamelFolder *folder, int exists,
mi = messages->pdata[i];
if (!mi) {
g_warning ("No information for message %d", i + first);
- continue;
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Incomplete server response: no information provided for message %d"),
+ i + first);
+ break;
}
uid = (char *)camel_message_info_uid(mi);
if (uid[0] == 0) {
g_warning("Server provided no uid: message %d", i + first);
- continue;
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Incomplete server response: no UID provided for message %d"),
+ i + first);
+ break;
}
info = camel_folder_summary_uid(folder->summary, uid);
if (info) {
+ for (seq = 0; seq < camel_folder_summary_count (folder->summary); seq++) {
+ if (folder->summary->messages->pdata[seq] == info)
+ break;
+ }
+
g_warning("Message already present? %s", camel_message_info_uid(mi));
+ camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
+ _("Unexpected server response: Identical UIDs provided for messages %d and %d"),
+ seq + 1, i + first);
+
camel_folder_summary_info_free(folder->summary, info);
- camel_folder_summary_info_free(folder->summary, mi);
- continue;
+ break;
}
camel_folder_summary_add (folder->summary, mi);
@@ -2480,27 +2494,14 @@ imap_update_summary (CamelFolder *folder, int exists,
if ((mi->flags & CAMEL_IMAP_MESSAGE_RECENT))
camel_folder_change_info_recent_uid(changes, camel_message_info_uid (mi));
}
- g_ptr_array_free (messages, TRUE);
- /* Kludge around Microsoft Exchange 5.5 IMAP - See bug #5348 for details */
- if (camel_folder_summary_count (folder->summary) != exists) {
- CamelImapStore *imap_store = (CamelImapStore *) folder->parent_store;
- CamelImapResponse *response;
-
- /* forget the currently selected folder */
- if (imap_store->current_folder) {
- camel_object_unref (CAMEL_OBJECT (imap_store->current_folder));
- imap_store->current_folder = NULL;
- }
-
- /* now re-select it and process the EXISTS response */
- response = camel_imap_command (imap_store, folder, ex, NULL);
- if (response) {
- camel_imap_folder_selected (folder, response, NULL);
- camel_imap_response_free (imap_store, response);
- }
+ for ( ; i < messages->len; i++) {
+ if ((mi = messages->pdata[i]))
+ camel_folder_summary_info_free(folder->summary, mi);
}
+ g_ptr_array_free (messages, TRUE);
+
return;
lose: