committed with approval on irc
On Thu, 2004-08-12 at 12:19 -0400, Jeffrey Stedfast wrote:
> 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
> Plain text document attachment (62771-camel.patch)
> ? 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);
>
--
Jeffrey Stedfast
Evolution Hacker - Novell, Inc.
fejj ximian com - www.novell.com
Attachment:
smime.p7s
Description: S/MIME cryptographic signature