changeset 6832:ea4d3778c99b HEAD

Charset translation fixes
author Timo Sirainen <tss@iki.fi>
date Sun, 18 Nov 2007 10:56:21 +0200
parents ddf393049f28
children 337e6a9a2959
files src/lib-mail/message-decoder.c
diffstat 1 files changed, 14 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-mail/message-decoder.c	Sun Nov 18 10:16:48 2007 +0200
+++ b/src/lib-mail/message-decoder.c	Sun Nov 18 10:56:21 2007 +0200
@@ -183,20 +183,24 @@
 				   const unsigned char **data, size_t *size)
 {
 	unsigned char trans_buf[MAX_TRANSLATION_BUF_SIZE+1];
-	size_t pos, skip;
+	unsigned int data_wanted, skip;
+	size_t trans_size;
 
-	/* @UNSAFE */
+	/* @UNSAFE: move the previously untranslated bytes to trans_buf
+	   and see if we have now enough data to get the next character
+	   translated */
 	memcpy(trans_buf, ctx->translation_buf, ctx->translation_size);
-	skip = sizeof(trans_buf) - ctx->translation_size;
-	if (skip > *size)
-		skip = *size;
-	memcpy(trans_buf + ctx->translation_size, data, skip);
+	data_wanted = sizeof(trans_buf) - ctx->translation_size;
+	if (data_wanted > *size)
+		data_wanted = *size;
+	memcpy(trans_buf + ctx->translation_size, *data, data_wanted);
 
-	pos = *size;
-	(void)charset_to_utf8(ctx->charset_trans, *data, &pos, ctx->buf2);
+	trans_size = ctx->translation_size + data_wanted;
+	(void)charset_to_utf8(ctx->charset_trans, trans_buf,
+			      &trans_size, ctx->buf2);
 
-	i_assert(pos > ctx->translation_size);
-	skip = (ctx->translation_size + skip) - pos;
+	i_assert(trans_size > ctx->translation_size);
+	skip = trans_size - ctx->translation_size;
 
 	i_assert(*size >= skip);
 	*data += skip;