Mercurial > dovecot > original-hg > dovecot-1.2
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;