Grow the output buffer as needed when flushing iconv
authorJeffrey Stedfast <fejj@gnome.org>
Tue, 20 Dec 2011 01:08:42 +0000 (20:08 -0500)
committerJeffrey Stedfast <fejj@gnome.org>
Tue, 20 Dec 2011 01:08:42 +0000 (20:08 -0500)
camel/camel-mime-filter-charset.c
camel/camel-mime-utils.c

index ec5daa5..8dd167c 100644 (file)
@@ -128,7 +128,15 @@ mime_filter_charset_complete (CamelMimeFilter *mime_filter,
        }
 
        /* flush the iconv conversion */
-       camel_iconv (priv->ic, NULL, NULL, &outbuf, &outleft);
+       while (camel_iconv (priv->ic, NULL, NULL, &outbuf, &outleft) == (gsize) -1) {
+               if (errno != E2BIG)
+                       break;
+               
+               converted = outbuf - mime_filter->outbuf;
+               camel_mime_filter_set_size (mime_filter, mime_filter->outsize + 16, TRUE);
+               outbuf = mime_filter->outbuf + converted;
+               outleft = mime_filter->outsize - converted;
+       }
 
        *out = mime_filter->outbuf;
        *outlen = mime_filter->outsize - outleft;
index 543631f..86de327 100644 (file)
@@ -878,7 +878,16 @@ camel_iconv_strndup (iconv_t cd,
         */
 
        /* flush the iconv conversion */
-       iconv (cd, NULL, NULL, &outbuf, &outleft);
+       while (iconv (cd, NULL, NULL, &outbuf, &outleft) == (gsize) -1) {
+               if (errno != E2BIG)
+                       break;
+               
+               outlen += 16;
+               converted = outbuf - out;
+               out = g_realloc (out, outlen + 4);
+               outleft = outlen - converted;
+               outbuf = out + converted;
+       }
 
        /* Note: not all charsets can be nul-terminated with a single
         * nul byte. UCS2, for example, needs 2 nul bytes and UCS4