1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
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. */
|