ok, last patch hopefully. Jeff On Thu, 2004-08-12 at 13:54 +0800, Not Zed wrote: > > > Index: ChangeLog > > =================================================================== > > RCS file: /cvs/gnome/evolution/camel/ChangeLog,v > > retrieving revision 1.2237 > > diff -u -r1.2237 ChangeLog > > --- ChangeLog 6 Aug 2004 19:24:03 -0000 1.2237 > > +++ ChangeLog 11 Aug 2004 16:45:26 -0000 > > @@ -1,3 +1,15 @@ > > +2004-08-11 Jeffrey Stedfast <fejj novell com> > > + > > + Fix for bug #62771 > > + > > + * camel-mime-utils.c (string_append_quoted_pair): New function to > > + append a string of text that may contain quoted-pairs. > > + (header_decode_text): Now takes a ctext argument specifying > > + whether or not to expect comments and to handle them. > > + (camel_header_decode_string): Pass FALSE as ctext argument. > > + (camel_header_format_ctext): New function to format text|comment > > + header field bodies. > > + > > 2004-08-06 Jeffrey Stedfast <fejj novell com> > > > > * providers/imap4/camel-imap4-summary.c (untagged_fetch_all): Call > > Index: camel-mime-utils.c > > =================================================================== > > RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.c,v > > retrieving revision 1.212 > > diff -u -r1.212 camel-mime-utils.c > > --- camel-mime-utils.c 30 Jul 2004 15:30:38 -0000 1.212 > > +++ camel-mime-utils.c 11 Aug 2004 16:45:26 -0000 > > @@ -1118,39 +1118,71 @@ > > > > } > > > > +static void > > +string_append_quoted_pair (GString *str, const char *in, int inlen) > > God, where did you pull the name of this out of? How about something > a bit more sane. > > append_quoted would match other functions in the file (append_latin1, > etc). > > > +{ > > + register const char *inptr = in; > > + const char *inend = in + inlen; > > + const char *start; > > + > > + while (inptr < inend) { > > + start = inptr; > > + while (inptr < inend && *inptr != '\\') > > + inptr++; > You have loops like this occasionally, much better to use memchr for > this. > > > + g_string_append_len (str, start, inptr - start); > > + inptr++; > > + > > + if (inptr < inend) > > + g_string_append_c (str, *inptr++); > > + } > > +} > > but, its still simpler just to do it char by char. > > while (inptr < inend) { > c = *inptr++; > if (c == '\' && inptr<inend) > g_string_append_c(str, *inptr++); > else > g_string_append_c(str, c); > } > > > > /* decodes a simple text, rfc822 + rfc2047 */ > > static char * > > -header_decode_text (const char *in, size_t inlen, const char *default_charset) > > +header_decode_text (const char *in, size_t inlen, int ctext, const char *default_charset) > > { > > GString *out; > > const char *inptr, *inend, *start, *chunk, *locale_charset; > > char *dword = NULL; > > + guint32 mask; > > > > locale_charset = e_iconv_locale_charset (); > > > > + if (ctext) > > + mask = (CAMEL_MIME_IS_SPECIAL | CAMEL_MIME_IS_SPACE | CAMEL_MIME_IS_CTRL); > > + else > > + mask = (CAMEL_MIME_IS_LWSP); > > + > > out = g_string_new (""); > > inptr = in; > > inend = inptr + inlen; > > chunk = NULL; > > - > > + > > Oi, stop adding tabs to the files! > > > while (inptr < inend) { > > start = inptr; > > - while (inptr < inend && camel_mime_is_lwsp(*inptr)) > > + while (inptr < inend && camel_mime_is_type (*inptr, mask)) > > inptr++; > > - > > + > > if (inptr == inend) { > > - g_string_append_len(out, start, inptr-start); > > + if (ctext) > > + string_append_quoted_pair (out, start, inptr - start); > > + else > > + g_string_append_len (out, start, inptr - start); > > If would be easier and more readable to use a function pointer here. > > i.e. outside the loop: > void (*append)(GString *, const char *, int); > > if (ctext) > append = append_quoted; > else > append = g_string_append_len; > > inside the loop: > > append(out, start, inptr-start); > > > > break; > > } else if (dword == NULL) { > > - g_string_append_len(out, start, inptr-start); > > + if (ctext) > > + string_append_quoted_pair (out, start, inptr - start); > > + else > > + g_string_append_len (out, start, inptr - start); > > } else { > > chunk = start; > > } > > - > > + > > start = inptr; > > - while (inptr < inend && !camel_mime_is_lwsp(*inptr)) > > + while (inptr < inend && !camel_mime_is_type (*inptr, mask)) > > inptr++; > > - > > + > > dword = rfc2047_decode_word(start, inptr-start); > > if (dword) { > > g_string_append(out, dword); > > @@ -1178,7 +1210,15 @@ > > { > > if (in == NULL) > > return NULL; > > - return header_decode_text (in, strlen (in), default_charset); > > + return header_decode_text (in, strlen (in), FALSE, default_charset); > > +} > > + > > +char * > > +camel_header_format_ctext (const char *in, const char *default_charset) > > +{ > > + if (in == NULL) > > + return NULL; > > + return header_decode_text (in, strlen (in), TRUE, default_charset); > > } > > > > /* how long a sequence of pre-encoded words should be less than, to attempt to > > @@ -2830,7 +2870,7 @@ > > node->next = NULL; > > node->name = name; > > if (strncmp(value, "=?", 2) == 0 > > - && (node->value = header_decode_text(value, strlen(value), NULL))) { > > + && (node->value = header_decode_text(value, strlen(value), FALSE, NULL))) { > > g_free(value); > > } else if (!g_utf8_validate(value, -1, NULL)) { > > const char * charset = e_iconv_locale_charset(); > > Index: camel-mime-utils.h > > =================================================================== > > RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.h,v > > retrieving revision 1.56 > > diff -u -r1.56 camel-mime-utils.h > > --- camel-mime-utils.h 18 Jun 2004 20:07:09 -0000 1.56 > > +++ camel-mime-utils.h 11 Aug 2004 16:45:26 -0000 > > @@ -194,6 +194,9 @@ > > char *camel_header_decode_string (const char *in, const char *default_charset); > > char *camel_header_encode_string (const unsigned char *in); > > > > +/* decode (text | comment) - a one-way op */ > > +char *camel_header_format_ctext (const char *in, const char *default_charset); > > + > > /* encode a phrase, like the real name of an address */ > > char *camel_header_encode_phrase (const unsigned char *in); > > > > And yeah, it doesn't handled nested comments and only escaping inside > comments. > > But i think enough time has been wasted on this pretty pointless bug > already. > > (quite frankly, who gives a flying about what mailer someone used). > -- > > Michael Zucchi <notzed ximian com> > "born to die, live to work, it's > all downhill from here" > Novell's Evolution and Free > Software Developer -- Jeffrey Stedfast Evolution Hacker - Novell, Inc. fejj ximian com - www.novell.com
? 24026.patch ? 62136.patch ? 62771-camel.patch ? body ? body.c ? body.txt ? body2.txt ? build.patch ? charset-map.c ? charset-map.diff ? class.sh ? cmsutil.c ? date.patch ? flags ? foo ? foo.txt ? foo2.txt ? gw-body.txt ? iso ? iso.c ? lang.patch ? namespace.sh ? smime ? providers/imap4/reconnect.patch ? tests/data/camel-mime-tests.tar.gz Index: ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/camel/ChangeLog,v retrieving revision 1.2238 diff -u -r1.2238 ChangeLog --- ChangeLog 12 Aug 2004 06:53:28 -0000 1.2238 +++ ChangeLog 12 Aug 2004 16:21:16 -0000 @@ -1,3 +1,15 @@ +2004-08-11 Jeffrey Stedfast <fejj novell com> + + Fix for bug #62771 + + * camel-mime-utils.c (string_append_quoted_pair): New function to + append a string of text that may contain quoted-pairs. + (header_decode_text): Now takes a ctext argument specifying + whether or not to expect comments and to handle them. + (camel_header_decode_string): Pass FALSE as ctext argument. + (camel_header_format_ctext): New function to format text|comment + header field bodies. + 2004-08-10 Not Zed <NotZed Ximian com> * providers/groupwise/camel-gw-listener.c Index: camel-mime-utils.c =================================================================== RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.c,v retrieving revision 1.212 diff -u -r1.212 camel-mime-utils.c --- camel-mime-utils.c 30 Jul 2004 15:30:38 -0000 1.212 +++ camel-mime-utils.c 12 Aug 2004 16:21:17 -0000 @@ -1118,39 +1118,65 @@ } +static void +append_quoted_pair (GString *str, const char *in, int inlen) +{ + register const char *inptr = in; + const char *inend = in + inlen; + char c; + + while (inptr < inend) { + c = *inptr++; + if (c == '\\' && inptr < inend) + g_string_append_c (str, *inptr++); + else + g_string_append_c (str, c); + } +} + /* decodes a simple text, rfc822 + rfc2047 */ static char * -header_decode_text (const char *in, size_t inlen, const char *default_charset) +header_decode_text (const char *in, size_t inlen, int ctext, const char *default_charset) { GString *out; const char *inptr, *inend, *start, *chunk, *locale_charset; + void (* append) (GString *, const char *, int); char *dword = NULL; + guint32 mask; locale_charset = e_iconv_locale_charset (); + if (ctext) { + mask = (CAMEL_MIME_IS_SPECIAL | CAMEL_MIME_IS_SPACE | CAMEL_MIME_IS_CTRL); + append = append_quoted_pair; + } else { + mask = (CAMEL_MIME_IS_LWSP); + append = g_string_append; + } + out = g_string_new (""); inptr = in; inend = inptr + inlen; chunk = NULL; - + while (inptr < inend) { start = inptr; - while (inptr < inend && camel_mime_is_lwsp(*inptr)) + while (inptr < inend && camel_mime_is_type (*inptr, mask)) inptr++; - + if (inptr == inend) { - g_string_append_len(out, start, inptr-start); + append (out, start, inptr - start); break; } else if (dword == NULL) { - g_string_append_len(out, start, inptr-start); + append (out, start, inptr - start); } else { chunk = start; } - + start = inptr; - while (inptr < inend && !camel_mime_is_lwsp(*inptr)) + while (inptr < inend && !camel_mime_is_type (*inptr, mask)) inptr++; - + dword = rfc2047_decode_word(start, inptr-start); if (dword) { g_string_append(out, dword); @@ -1178,7 +1204,15 @@ { if (in == NULL) return NULL; - return header_decode_text (in, strlen (in), default_charset); + return header_decode_text (in, strlen (in), FALSE, default_charset); +} + +char * +camel_header_format_ctext (const char *in, const char *default_charset) +{ + if (in == NULL) + return NULL; + return header_decode_text (in, strlen (in), TRUE, default_charset); } /* how long a sequence of pre-encoded words should be less than, to attempt to @@ -2830,7 +2864,7 @@ node->next = NULL; node->name = name; if (strncmp(value, "=?", 2) == 0 - && (node->value = header_decode_text(value, strlen(value), NULL))) { + && (node->value = header_decode_text(value, strlen(value), FALSE, NULL))) { g_free(value); } else if (!g_utf8_validate(value, -1, NULL)) { const char * charset = e_iconv_locale_charset(); Index: camel-mime-utils.h =================================================================== RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.h,v retrieving revision 1.56 diff -u -r1.56 camel-mime-utils.h --- camel-mime-utils.h 18 Jun 2004 20:07:09 -0000 1.56 +++ camel-mime-utils.h 12 Aug 2004 16:21:17 -0000 @@ -194,6 +194,9 @@ char *camel_header_decode_string (const char *in, const char *default_charset); char *camel_header_encode_string (const unsigned char *in); +/* decode (text | comment) - a one-way op */ +char *camel_header_format_ctext (const char *in, const char *default_charset); + /* encode a phrase, like the real name of an address */ char *camel_header_encode_phrase (const unsigned char *in);
Attachment:
smime.p7s
Description: S/MIME cryptographic signature