dovecot-2.2: lib-mail: Switched message-decoder to use qp-decoder.
dovecot at dovecot.org
dovecot at dovecot.org
Sun May 3 13:28:36 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/b10aebbb42df
changeset: 18506:b10aebbb42df
user: Timo Sirainen <tss at iki.fi>
date: Sun May 03 16:23:41 2015 +0300
description:
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*()
diffstat:
src/lib-mail/Makefile.am | 2 +-
src/lib-mail/message-decoder.c | 33 ++++++++++++++++++++-------------
src/lib-mail/test-message-decoder.c | 1 -
3 files changed, 21 insertions(+), 15 deletions(-)
diffs (111 lines):
diff -r a8e9fdcb17c5 -r b10aebbb42df src/lib-mail/Makefile.am
--- 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
diff -r a8e9fdcb17c5 -r b10aebbb42df src/lib-mail/message-decoder.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;
diff -r a8e9fdcb17c5 -r b10aebbb42df src/lib-mail/test-message-decoder.c
--- 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"
More information about the dovecot-cvs
mailing list