Fixes bug #42295 and the infinite loop part of bug #58766 (these 2 bugs
authorJeffrey Stedfast <fejj@novell.com>
Thu, 20 May 2004 19:16:53 +0000 (19:16 +0000)
committerJeffrey Stedfast <fejj@src.gnome.org>
Thu, 20 May 2004 19:16:53 +0000 (19:16 +0000)
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).

camel/ChangeLog
camel/providers/imap/camel-imap-folder.c

index 2b55f96..ddd90a7 100644 (file)
@@ -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):
index b75373a..d2da841 100644 (file)
@@ -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: