From: Timo Sirainen Date: Sun, 28 Feb 2016 20:08:40 +0000 (+0200) Subject: lib-mail: message_search_msg() passes through message_parser_deinit_from_parts()... X-Git-Tag: 2.2.22.rc1~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7cef8159e93997ae75f94cfe1a3ab974b85d5737;p=thirdparty%2Fdovecot%2Fcore.git lib-mail: message_search_msg() passes through message_parser_deinit_from_parts()'s error string --- diff --git a/src/lib-mail/message-search.c b/src/lib-mail/message-search.c index c78006cafa..001f884820 100644 --- a/src/lib-mail/message-search.c +++ b/src/lib-mail/message-search.c @@ -193,7 +193,8 @@ void message_search_reset(struct message_search_context *ctx) static int message_search_msg_real(struct message_search_context *ctx, - struct istream *input, struct message_part *parts) + struct istream *input, struct message_part *parts, + const char **error_r) { const enum message_header_parser_flags hdr_parser_flags = MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE; @@ -224,7 +225,7 @@ message_search_msg_real(struct message_search_context *ctx, /* normal exit */ ret = 0; } - if (message_parser_deinit(&parser_ctx, &new_parts) < 0) { + if (message_parser_deinit_from_parts(&parser_ctx, &new_parts, error_r) < 0) { /* broken parts */ ret = -1; } @@ -232,12 +233,17 @@ message_search_msg_real(struct message_search_context *ctx, } int message_search_msg(struct message_search_context *ctx, - struct istream *input, struct message_part *parts) + struct istream *input, struct message_part *parts, + const char **error_r) { + char *error; int ret; T_BEGIN { - ret = message_search_msg_real(ctx, input, parts); + ret = message_search_msg_real(ctx, input, parts, error_r); + error = i_strdup(*error_r); } T_END; + *error_r = t_strdup(error); + i_free(error); return ret; } diff --git a/src/lib-mail/message-search.h b/src/lib-mail/message-search.h index 5c0c949d5c..7d3786a360 100644 --- a/src/lib-mail/message-search.h +++ b/src/lib-mail/message-search.h @@ -33,7 +33,8 @@ void message_search_reset(struct message_search_context *ctx); /* Search a full message. Returns 1 if match was found, 0 if not, -1 if error (if stream_error == 0, the parts contained broken data) */ int message_search_msg(struct message_search_context *ctx, - struct istream *input, struct message_part *parts) + struct istream *input, struct message_part *parts, + const char **error_r) ATTR_NULL(3); #endif diff --git a/src/lib-storage/index/index-search.c b/src/lib-storage/index/index-search.c index 39f5063157..561e0bcd25 100644 --- a/src/lib-storage/index/index-search.c +++ b/src/lib-storage/index/index-search.c @@ -628,6 +628,7 @@ static void search_body(struct mail_search_arg *arg, struct search_body_context *ctx) { struct message_search_context *msg_search_ctx; + const char *error; int ret; switch (arg->type) { @@ -645,15 +646,15 @@ static void search_body(struct mail_search_arg *arg, } i_stream_seek(ctx->input, 0); - ret = message_search_msg(msg_search_ctx, ctx->input, ctx->part); + ret = message_search_msg(msg_search_ctx, ctx->input, ctx->part, &error); if (ret < 0 && ctx->input->stream_errno == 0) { /* try again without cached parts */ mail_set_cache_corrupted_reason(ctx->index_ctx->cur_mail, - MAIL_FETCH_MESSAGE_PARTS, - "Cached MIME parts don't match message during parsing in SEARCH"); + MAIL_FETCH_MESSAGE_PARTS, t_strdup_printf( + "Cached MIME parts don't match message during parsing in SEARCH: %s", error)); i_stream_seek(ctx->input, 0); - ret = message_search_msg(msg_search_ctx, ctx->input, NULL); + ret = message_search_msg(msg_search_ctx, ctx->input, NULL, &error); i_assert(ret >= 0 || ctx->input->stream_errno != 0); } if (ctx->input->stream_errno != 0) {