Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8871:7c21256e3598 HEAD
charset_to_utf8() may have tried to allocate a lot of memory in some conditions.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 26 Mar 2009 18:17:09 -0400 |
parents | c5b2260f767d |
children | 643a96aec996 |
files | src/lib-charset/charset-iconv.c |
diffstat | 1 files changed, 12 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-charset/charset-iconv.c Wed Mar 25 20:38:46 2009 -0400 +++ b/src/lib-charset/charset-iconv.c Thu Mar 26 18:17:09 2009 -0400 @@ -129,8 +129,9 @@ 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 @@ 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; + } } }