Bug 77076

Summary: evolution port needs fix for ximian bug 70556 (FIX ATTACHED)
Product: Ports & Packages Reporter: Georg-W. Koltermann <gwk>
Component: Individual Port(s)Assignee: freebsd-gnome (Nobody) <gnome>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: Latest   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
file.diff none

Description Georg-W. Koltermann 2005-02-03 21:30:22 UTC
I found that the current evolution port (2.0.3) hangs when accessing
my Lotus Notes IMAP account.  The message was "evolution-2.0:1002): camel-imap-provider-WARNING **: Server sent empty line after a literal, assuming in error"

Searching the net I found that this is bug 70556 in Ximian bugzilla,
and is fixed by the patch enclosed below. The patch did solve my
problem.

I think we should add the patch to our port.

Fix: ** See bug #69533.


extern int camel_verbose_debug;

@@ -409,7 +409,7 @@ imap_read_response (CamelImapStore *stor
 static char *
 imap_read_untagged (CamelImapStore *store, char *line, CamelException *ex)
 {
-       int fulllen, ldigits, nread, i;
+       int fulllen, ldigits, nread, i, sexp = 0;
        unsigned int length;
        GPtrArray *data;
        GString *str;
@@ -431,6 +431,18 @@ imap_read_untagged (CamelImapStore *stor
                p = strrchr (str->str, '{');
                if (!p)
                        break;
+
+               /* HACK ALERT: We scan the non-literal part of the string, looking for possible s expression braces.
+                  This assumes we're getting s-expressions, which we should be.
+                  This is so if we get a blank line after a literal, in an s-expression, we can keep going, since
+                  we do no other parsing at this level.
+                  TODO: handle quoted strings? */
+               for (s=str->str; s<p; s++) {
+                       if (*s == '(')
+                               sexp++;
+                       else if (*s == ')')
+                               sexp--;
+               }

                length = strtoul (p + 1, &end, 10);
                if (*end != '}' || *(end + 1) || end == p + 1 || length >= UINT_MAX - 2)
@@ -460,6 +472,12 @@ imap_read_untagged (CamelImapStore *stor
                        goto lose;
                }
                str->str[length + 1] = '\0';
+
+               if (camel_debug("imap")) {
+                       printf("Literal: -->");
+                       fwrite(str->str+1, 1, length, stdout);
+                       printf("<--\n");
+               }

                /* Fix up the literal, turning CRLFs into LF. Also, if
                 * we find any embedded NULs, strip them. This is
@@ -505,10 +523,11 @@ imap_read_untagged (CamelImapStore *stor
                        if (camel_imap_store_readline (store, &line, ex) < 0)
                                goto lose;

-                       /* MAJOR HACK ALERT, gropuwise sometimes sends an extra blank line after literals, check that here */
-                       if (line[0] == 0)
+                       /* MAJOR HACK ALERT, gropuwise sometimes sends an extra blank line after literals, check that here
+                          But only do it if we're inside an sexpression */
+                       if (line[0] == 0 && sexp > 0)
                                g_warning("Server sent empty line after a literal, assuming in error");
-               } while (line[0] == 0);
+               } while (line[0] == 0 && sexp > 0);
        }

        /* Now reassemble the data. */--9d24xXRo0pkIn0Mpt7iensEkMZ0G7o5ZqeIBO8xfokVylHGV
Content-Type: text/plain; name="file.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="file.diff"

Index: camel/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.2251.2.28
diff -u -p -r1.2251.2.28 ChangeLog
--- camel/ChangeLog     3 Dec 2004 03:03:02 -0000       1.2251.2.28
+++ camel/ChangeLog     23 Dec 2004 07:23:55 -0000
@@ -1,3 +1,12 @@
+2004-12-23  Not Zed  <NotZed@Ximian.com>
+
+       ** See bug #70556.
+
+       * providers/imap/camel-imap-command.c (imap_read_untagged): scan
+       the non-literal contnet for s-expression brackets, and if we seem
+       to be outside of one, don't try the 'blank line after literal'
+       hack.
+
 2004-12-02  Not Zed  <NotZed@Ximian.com>
Comment 1 Volker Stolz freebsd_committer freebsd_triage 2005-02-04 15:06:00 UTC
Responsible Changed
From-To: freebsd-ports-bugs->gnome

This is GNOME territory.
Comment 2 Joe Marcus Clarke freebsd_committer freebsd_triage 2005-02-09 06:04:30 UTC
State Changed
From-To: open->feedback

This patch does not apply.  It looks like you pasted this patch into the PR, 
and thus all of the tabs became spaces.  Please resubmit the patch, or 
better yet, post it to a website.
Comment 3 Georg-W. Koltermann 2005-02-09 10:00:40 UTC
Yes I did paste the fix.  Sorry for the breakage.

The fix can also be retrieved directly from Ximian bugzilla at
http://bugzilla.ximian.com/showattachment.cgi?attach_id=13585

--
Regards,
gwk
Comment 4 Joe Marcus Clarke freebsd_committer freebsd_triage 2005-02-11 07:34:23 UTC
State Changed
From-To: feedback->closed

Committed, thanks!