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;
+		}
 	}
 }