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>
Responsible Changed From-To: freebsd-ports-bugs->gnome This is GNOME territory.
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.
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
State Changed From-To: feedback->closed Committed, thanks!