From 511e3153b986168e7dd189b82b1878bd43b49981 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 8 Aug 2002 00:11:29 +0000 Subject: Oops - outbuf pointed to alloca'd memory but we were g_free'ing it after 2002-08-07 Jeffrey Stedfast * camel-mime-utils.c (header_encode_param): Oops - outbuf pointed to alloca'd memory but we were g_free'ing it after using it. Instead use g_malloc for this outbuf buffer since it may be kinda large. Also don't depend on a single byte to nul-terminate the outbuf buffer so as to be safe with charsets such as UCS2 and UCS4, instead keep a pointer to the end of the buffer. svn path=/trunk/; revision=17737 --- camel/camel-mime-utils.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'camel/camel-mime-utils.c') diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index e594a43ed4..3dc31f04d3 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -2929,6 +2929,7 @@ header_encode_param (const unsigned char *in, gboolean *encoded) { register const unsigned char *inptr = in; unsigned char *outbuf = NULL; + const unsigned char *inend; iconv_t cd = (iconv_t) -1; const char *charset; char *outstr; @@ -2985,14 +2986,15 @@ header_encode_param (const unsigned char *in, gboolean *encoded) if (cd == (iconv_t) -1) { charset = "UTF-8"; inptr = in; + inend = inptr + strlen (in); } else { size_t inleft, outleft; const char *inbuf; char *outptr; inleft = (inptr - in); - outleft = inleft * 6 + 16 + 1; - outptr = outbuf = alloca (outleft); + outleft = inleft * 6 + 20; + outptr = outbuf = g_malloc (outleft); inbuf = in; if (e_iconv (cd, &inbuf, &inleft, &outptr, &outleft) == (size_t) -1) { @@ -3003,16 +3005,15 @@ header_encode_param (const unsigned char *in, gboolean *encoded) e_iconv_close (cd); - *outptr = '\0'; - inptr = outbuf; + inend = outptr; } /* FIXME: set the 'language' as well, assuming we can get that info...? */ out = g_string_new (""); g_string_sprintfa (out, "%s''", charset); - while (inptr && *inptr) { + while (inptr < inend) { unsigned char c = *inptr++; /* FIXME: make sure that '\'', '*', and ';' are also encoded */ -- cgit