From: Timo Sirainen Date: Wed, 11 May 2011 19:34:27 +0000 (+0300) Subject: doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash. X-Git-Tag: 2.1.alpha1~257 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec1fe002da484f4c06f0c072d673abac74b66b9e;p=thirdparty%2Fdovecot%2Fcore.git doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash. --- diff --git a/src/doveadm/doveadm-mail-fetch.c b/src/doveadm/doveadm-mail-fetch.c index 70ebaca90d..ab784fada0 100644 --- a/src/doveadm/doveadm-mail-fetch.c +++ b/src/doveadm/doveadm-mail-fetch.c @@ -392,30 +392,19 @@ cmd_fetch_box(struct fetch_cmd_context *ctx, const struct mailbox_info *info) { struct doveadm_mail_iter *iter; struct mailbox_transaction_context *trans; - struct mailbox_header_lookup_ctx *headers = NULL; - int ret; - - if (array_count(&ctx->header_fields) > 1) { - headers = mailbox_header_lookup_init( - mailbox_transaction_get_mailbox(trans), - array_idx(&ctx->header_fields, 0)); - } if (doveadm_mail_iter_init(info, ctx->ctx.search_args, - ctx->wanted_fields, headers, + ctx->wanted_fields, + array_idx(&ctx->header_fields, 0), &trans, &iter) < 0) - ret = -1; - else { - while (doveadm_mail_iter_next(iter, &ctx->mail)) { - T_BEGIN { - cmd_fetch_mail(ctx); - } T_END; - } - ret = doveadm_mail_iter_deinit(&iter); + return -1; + + while (doveadm_mail_iter_next(iter, &ctx->mail)) { + T_BEGIN { + cmd_fetch_mail(ctx); + } T_END; } - if (headers != NULL) - mailbox_header_lookup_unref(&headers); - return ret; + return doveadm_mail_iter_deinit(&iter); } static void diff --git a/src/doveadm/doveadm-mail-iter.c b/src/doveadm/doveadm-mail-iter.c index 5829f28a1d..4cb3811777 100644 --- a/src/doveadm/doveadm-mail-iter.c +++ b/src/doveadm/doveadm-mail-iter.c @@ -17,11 +17,12 @@ struct doveadm_mail_iter { int doveadm_mail_iter_init(const struct mailbox_info *info, struct mail_search_args *search_args, enum mail_fetch_field wanted_fields, - struct mailbox_header_lookup_ctx *wanted_headers, + const char *const *wanted_headers, struct mailbox_transaction_context **trans_r, struct doveadm_mail_iter **iter_r) { struct doveadm_mail_iter *iter; + struct mailbox_header_lookup_ctx *headers_ctx; iter = i_new(struct doveadm_mail_iter, 1); iter->box = mailbox_alloc(info->ns->list, info->name, @@ -37,10 +38,13 @@ int doveadm_mail_iter_init(const struct mailbox_info *info, return -1; } + headers_ctx = wanted_headers == NULL || wanted_headers[0] == NULL ? + NULL : mailbox_header_lookup_init(iter->box, wanted_headers); + mail_search_args_init(search_args, iter->box, FALSE, NULL); iter->t = mailbox_transaction_begin(iter->box, 0); iter->search_ctx = mailbox_search_init(iter->t, search_args, NULL, - wanted_fields, wanted_headers); + wanted_fields, headers_ctx); *trans_r = iter->t; *iter_r = iter; diff --git a/src/doveadm/doveadm-mail-iter.h b/src/doveadm/doveadm-mail-iter.h index 8df17fa607..7c1ee8d4fa 100644 --- a/src/doveadm/doveadm-mail-iter.h +++ b/src/doveadm/doveadm-mail-iter.h @@ -6,7 +6,7 @@ struct doveadm_mail_iter; int doveadm_mail_iter_init(const struct mailbox_info *info, struct mail_search_args *search_args, enum mail_fetch_field wanted_fields, - struct mailbox_header_lookup_ctx *wanted_headers, + const char *const *wanted_headers, struct mailbox_transaction_context **trans_r, struct doveadm_mail_iter **iter_r); int doveadm_mail_iter_deinit(struct doveadm_mail_iter **iter);