[evolution-patches] 70556, imap hang on exchange, groupwise workaround




Guys,

Knew this was going to get messy, the fix for the groupwise server bug has caused other problems.

This messy bit of code tries to do some higher-level structure parsing of the data, and works out if it is expecting more data when it gets nothing back, or it is just the end of that untagged response.  Its not totally full-proof, since you need to do more syntax checking, but it should cover more cases, I think.

Unable to test it however 'cause I couldn't get any of my servers to send literal responses for folder names.

Patch against 2.8 similar against head.

Michael

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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]