]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
charset_to_utf8() may have tried to allocate a lot of memory in some conditions.
authorTimo Sirainen <tss@iki.fi>
Thu, 26 Mar 2009 22:17:09 +0000 (18:17 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 26 Mar 2009 22:17:09 +0000 (18:17 -0400)
--HG--
branch : HEAD

src/lib-charset/charset-iconv.c

index a7ca45623a467c75a4e883cecf5ad2d651fed9e1..40f1e8fc24b9a1c2151cc1610ad2a502fe915ddb 100644 (file)
@@ -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;
+               }
        }
 }