]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: doveadm_mail_iter_init() API change to fix "doveadm fetch" crash.
authorTimo Sirainen <tss@iki.fi>
Wed, 11 May 2011 19:34:27 +0000 (22:34 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 11 May 2011 19:34:27 +0000 (22:34 +0300)
src/doveadm/doveadm-mail-fetch.c
src/doveadm/doveadm-mail-iter.c
src/doveadm/doveadm-mail-iter.h

index 70ebaca90d5501eae2147714223cc67152c07685..ab784fada039f51e0a5263c475625f4fa970e47a 100644 (file)
@@ -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
index 5829f28a1d90498aad9b7021e136389ef22b6a19..4cb38117776a4346b40deecd744b544a8400307a 100644 (file)
@@ -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;
index 8df17fa6077a135eb7ee0f553305fdb4f8bc1b65..7c1ee8d4faec859b4d9d83866e3c4321bd7266ae 100644 (file)
@@ -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);