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