aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
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 /camel/providers
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
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/imap/camel-imap-folder.c45
1 files changed, 23 insertions, 22 deletions
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: