dovecot: Message decoding wasn't reset properly between messages...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Dec 3 16:09:24 EET 2007
details: http://hg.dovecot.org/dovecot/rev/0b8a78914db7
changeset: 6916:0b8a78914db7
user: Timo Sirainen <tss at iki.fi>
date: Mon Dec 03 16:09:21 2007 +0200
description:
Message decoding wasn't reset properly between messages when searching.
diffstat:
3 files changed, 46 insertions(+), 15 deletions(-)
src/lib-mail/message-decoder.c | 57 +++++++++++++++++++++++++++++-----------
src/lib-mail/message-decoder.h | 3 ++
src/lib-mail/message-search.c | 1
diffs (123 lines):
diff -r 671c2eb25f3d -r 0b8a78914db7 src/lib-mail/message-decoder.c
--- a/src/lib-mail/message-decoder.c Mon Dec 03 15:41:01 2007 +0200
+++ b/src/lib-mail/message-decoder.c Mon Dec 03 16:09:21 2007 +0200
@@ -32,6 +32,7 @@ struct message_decoder_context {
struct message_header_line hdr;
buffer_t *buf, *buf2;
+ char *charset_trans_charset;
struct charset_translation *charset_trans;
char translation_buf[MAX_TRANSLATION_BUF_SIZE];
unsigned int translation_size;
@@ -68,6 +69,7 @@ void message_decoder_deinit(struct messa
buffer_free(&ctx->buf);
buffer_free(&ctx->buf2);
+ i_free(ctx->charset_trans_charset);
i_free(ctx->content_charset);
i_free(ctx);
}
@@ -268,23 +270,39 @@ broken:
return tmpbuf->data;
}
+static void message_decode_body_init_charset(struct message_decoder_context *ctx)
+{
+ enum charset_flags flags;
+
+ if (ctx->charset_utf8)
+ return;
+
+ if (ctx->charset_trans != NULL &&
+ strcasecmp(ctx->content_charset, ctx->charset_trans_charset) == 0) {
+ /* already have the correct translation selected */
+ return;
+ }
+
+ if (ctx->charset_trans != NULL)
+ charset_to_utf8_end(&ctx->charset_trans);
+ i_free(ctx->charset_trans_charset);
+
+ flags = ctx->dtcase ? CHARSET_FLAG_DECOMP_TITLECASE : 0;
+ ctx->charset_trans_charset = i_strdup(ctx->content_charset != NULL ?
+ ctx->content_charset : "UTF-8");
+ if (charset_to_utf8_begin(ctx->charset_trans_charset,
+ flags, &ctx->charset_trans) < 0)
+ ctx->charset_trans = NULL;
+}
+
static bool message_decode_body(struct message_decoder_context *ctx,
struct message_block *input,
struct message_block *output)
{
unsigned char new_buf[MAX_ENCODING_BUF_SIZE+1];
- enum charset_flags flags;
const unsigned char *data = NULL;
size_t pos, size = 0, skip = 0;
int ret;
-
- if (ctx->charset_trans == NULL && !ctx->charset_utf8) {
- flags = ctx->dtcase ? CHARSET_FLAG_DECOMP_TITLECASE : 0;
- if (charset_to_utf8_begin(ctx->content_charset != NULL ?
- ctx->content_charset : "UTF-8",
- flags, &ctx->charset_trans) < 0)
- ctx->charset_trans = NULL;
- }
if (ctx->encoding_size != 0) {
/* @UNSAFE */
@@ -404,10 +422,7 @@ bool message_decoder_decode_next_block(s
{
if (input->part != ctx->prev_part) {
/* MIME part changed. */
- i_free_and_null(ctx->content_charset);
- ctx->content_type = CONTENT_TYPE_BINARY;
- ctx->charset_utf8 = TRUE;
- ctx->encoding_size = 0;
+ message_decoder_decode_reset(ctx);
}
output->part = input->part;
@@ -415,6 +430,18 @@ bool message_decoder_decode_next_block(s
if (input->hdr != NULL)
return message_decode_header(ctx, input->hdr, output);
- else
+ else if (input->size != 0)
return message_decode_body(ctx, input, output);
-}
+ else {
+ message_decode_body_init_charset(ctx);
+ return TRUE;
+ }
+}
+
+void message_decoder_decode_reset(struct message_decoder_context *ctx)
+{
+ i_free_and_null(ctx->content_charset);
+ ctx->content_type = CONTENT_TYPE_BINARY;
+ ctx->charset_utf8 = TRUE;
+ ctx->encoding_size = 0;
+}
diff -r 671c2eb25f3d -r 0b8a78914db7 src/lib-mail/message-decoder.h
--- a/src/lib-mail/message-decoder.h Mon Dec 03 15:41:01 2007 +0200
+++ b/src/lib-mail/message-decoder.h Mon Dec 03 16:09:21 2007 +0200
@@ -19,4 +19,7 @@ bool message_decoder_decode_next_block(s
struct message_block *input,
struct message_block *output);
+/* Call whenever message changes */
+void message_decoder_decode_reset(struct message_decoder_context *ctx);
+
#endif
diff -r 671c2eb25f3d -r 0b8a78914db7 src/lib-mail/message-search.c
--- a/src/lib-mail/message-search.c Mon Dec 03 15:41:01 2007 +0200
+++ b/src/lib-mail/message-search.c Mon Dec 03 16:09:21 2007 +0200
@@ -191,6 +191,7 @@ void message_search_reset(struct message
ctx->prev_part = NULL;
str_find_reset(ctx->str_find_ctx);
+ message_decoder_decode_reset(ctx->decoder);
}
int message_search_msg(struct message_search_context *ctx,
More information about the dovecot-cvs
mailing list