From: Timo Sirainen Date: Thu, 26 Mar 2009 22:17:09 +0000 (-0400) Subject: charset_to_utf8() may have tried to allocate a lot of memory in some conditions. X-Git-Tag: 1.2.rc1~37 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6be73f6d5668fe02d745bd70bf4d0f6419248298;p=thirdparty%2Fdovecot%2Fcore.git charset_to_utf8() may have tried to allocate a lot of memory in some conditions. --HG-- branch : HEAD --- diff --git a/src/lib-charset/charset-iconv.c b/src/lib-charset/charset-iconv.c index a7ca45623a..40f1e8fc24 100644 --- a/src/lib-charset/charset-iconv.c +++ b/src/lib-charset/charset-iconv.c @@ -129,8 +129,9 @@ enum charset_result charset_to_utf8(struct charset_translation *t, const unsigned char *src, size_t *src_size, buffer_t *dest) { + bool dtcase = (t->flags & CHARSET_FLAG_DECOMP_TITLECASE) != 0; enum charset_result result; - size_t pos, used, size; + size_t pos, used, size, prev_used = 0; bool ret; for (pos = 0;;) { @@ -143,11 +144,16 @@ charset_to_utf8(struct charset_translation *t, return result; } - /* force buffer to grow */ - used = dest->used; - size = buffer_get_size(dest) - used + 1; - (void)buffer_append_space_unsafe(dest, size); - buffer_set_used_size(dest, used); + if (!dtcase) { + /* force buffer to grow */ + used = dest->used; + size = buffer_get_size(dest) - used + 1; + (void)buffer_append_space_unsafe(dest, size); + buffer_set_used_size(dest, used); + } else { + i_assert(dest->used != prev_used); + prev_used = dest->used; + } } }