Mercurial > dovecot > core-2.2
changeset 18506:b10aebbb42df
lib-mail: Switched message-decoder to use qp-decoder.
This probably doesn't fix any actual bugs, but allows getting rid of the
quoted_printable_decode*()
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 03 May 2015 16:23:41 +0300 |
parents | a8e9fdcb17c5 |
children | 780a8f4544ec |
files | src/lib-mail/Makefile.am src/lib-mail/message-decoder.c src/lib-mail/test-message-decoder.c |
diffstat | 3 files changed, 21 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-mail/Makefile.am Sun May 03 16:22:55 2015 +0300 +++ b/src/lib-mail/Makefile.am Sun May 03 16:23:41 2015 +0300 @@ -145,7 +145,7 @@ test_message_date_DEPENDENCIES = $(test_deps) test_message_decoder_SOURCES = test-message-decoder.c -test_message_decoder_LDADD = message-decoder.lo quoted-printable.lo rfc822-parser.lo rfc2231-parser.lo ../lib-charset/libcharset.la $(test_libs) +test_message_decoder_LDADD = message-decoder.lo qp-decoder.lo quoted-printable.lo rfc822-parser.lo rfc2231-parser.lo ../lib-charset/libcharset.la $(test_libs) test_message_decoder_DEPENDENCIES = ../lib-charset/libcharset.la $(test_deps) test_message_header_decode_SOURCES = test-message-header-decode.c
--- a/src/lib-mail/message-decoder.c Sun May 03 16:22:55 2015 +0300 +++ b/src/lib-mail/message-decoder.c Sun May 03 16:23:41 2015 +0300 @@ -6,7 +6,7 @@ #include "str.h" #include "unichar.h" #include "charset-utf8.h" -#include "quoted-printable.h" +#include "qp-decoder.h" #include "rfc822-parser.h" #include "rfc2231-parser.h" #include "message-parser.h" @@ -29,6 +29,7 @@ char translation_buf[CHARSET_MAX_PENDING_BUF_SIZE]; unsigned int translation_size; + struct qp_decoder *qp; buffer_t *encoding_buf; char *content_type, *content_charset; @@ -64,6 +65,8 @@ if (ctx->charset_trans != NULL) charset_to_utf8_end(&ctx->charset_trans); + if (ctx->qp != NULL) + qp_decoder_deinit(&ctx->qp); buffer_free(&ctx->encoding_buf); buffer_free(&ctx->buf); @@ -265,12 +268,11 @@ { const unsigned char *data = NULL; size_t pos = 0, size = 0; + const char *error; int ret; - if (ctx->encoding_buf->used != 0) { - /* @UNSAFE */ + if (ctx->encoding_buf->used != 0) buffer_append(ctx->encoding_buf, input->data, input->size); - } switch (ctx->message_cte) { case MESSAGE_CTE_UNKNOWN: @@ -279,22 +281,23 @@ case MESSAGE_CTE_78BIT: case MESSAGE_CTE_BINARY: + i_assert(ctx->encoding_buf->used == 0); data = input->data; size = pos = input->size; break; - case MESSAGE_CTE_QP: + case MESSAGE_CTE_QP: { + i_assert(ctx->encoding_buf->used == 0); buffer_set_used_size(ctx->buf, 0); - if (ctx->encoding_buf->used != 0) { - (void)quoted_printable_decode(ctx->encoding_buf->data, - ctx->encoding_buf->used, - &pos, ctx->buf); - } else { - (void)quoted_printable_decode(input->data, input->size, - &pos, ctx->buf); - } + if (ctx->qp == NULL) + ctx->qp = qp_decoder_init(ctx->buf); + (void)qp_decoder_more(ctx->qp, input->data, input->size, + &pos, &error); data = ctx->buf->data; size = ctx->buf->used; + /* eat away all input. qp-decoder buffers it internally. */ + pos = input->size; break; + } case MESSAGE_CTE_BASE64: buffer_set_used_size(ctx->buf, 0); if (ctx->encoding_buf->used != 0) { @@ -386,6 +389,10 @@ void message_decoder_decode_reset(struct message_decoder_context *ctx) { + const char *error; + + if (ctx->qp != NULL) + (void)qp_decoder_finish(ctx->qp, &error); i_free_and_null(ctx->content_type); i_free_and_null(ctx->content_charset); ctx->message_cte = MESSAGE_CTE_78BIT;
--- a/src/lib-mail/test-message-decoder.c Sun May 03 16:22:55 2015 +0300 +++ b/src/lib-mail/test-message-decoder.c Sun May 03 16:23:41 2015 +0300 @@ -3,7 +3,6 @@ #include "lib.h" #include "buffer.h" #include "charset-utf8.h" -#include "quoted-printable.h" #include "message-parser.h" #include "message-header-decode.h" #include "message-decoder.h"