Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 Feb 2005 21:24:37 GMT
From:      "Georg-W. Koltermann" <gwk@rahn-koltermann.de>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/77076: evolution port needs fix for ximian bug 70556 (FIX ATTACHED)
Message-ID:  <200502032124.j13LObqH037842@www.freebsd.org>
Resent-Message-ID: <200502032130.j13LUMsv028886@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         77076
>Category:       ports
>Synopsis:       evolution port needs fix for ximian bug 70556 (FIX ATTACHED)
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Feb 03 21:30:22 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Georg-W. Koltermann
>Release:        5.3
>Organization:
>Environment:
FreeBSD hunter.localnet 5.3-RELEASE FreeBSD 5.3-RELEASE #9: Wed Jan 19 12:11:29 CET 2005     gwk@hunter.localnet:/usr/obj/usr/src/sys/HUNTER  i386

>Description:
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.

>How-To-Repeat:
      
>Fix:
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>

        ** See bug #69533.
Index: camel/providers/imap/camel-imap-command.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/providers/imap/camel-imap-command.c,v
retrieving revision 1.60.26.2
diff -u -p -r1.60.26.2 camel-imap-command.c
--- camel/providers/imap/camel-imap-command.c   3 Dec 2004 03:03:02 -0000       1.60.26.2
+++ camel/providers/imap/camel-imap-command.c   23 Dec 2004 07:23:56 -0000
@@ -43,7 +43,7 @@
 #include <camel/camel-private.h>
 #include <camel/camel-utf8.h>
 #include <camel/camel-session.h>
-
+#include <camel/camel-debug.h>

 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. */

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200502032124.j13LObqH037842>