From: Timo Sirainen Date: Wed, 28 Apr 2010 19:25:33 +0000 (+0300) Subject: doveadm altmove: Fixed assert-crashing X-Git-Tag: 2.0.beta5~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=24276873986553ddb10deb11d66fa9652f4678df;p=thirdparty%2Fdovecot%2Fcore.git doveadm altmove: Fixed assert-crashing --HG-- branch : HEAD --- diff --git a/src/doveadm/doveadm-mail-altmove.c b/src/doveadm/doveadm-mail-altmove.c index e3eed103e8..12f0ad03d9 100644 --- a/src/doveadm/doveadm-mail-altmove.c +++ b/src/doveadm/doveadm-mail-altmove.c @@ -77,6 +77,7 @@ void cmd_altmove(struct mail_user *user, const char *const args[]) { const enum mailbox_list_iter_flags iter_flags = MAILBOX_LIST_ITER_RAW_LIST | + MAILBOX_LIST_ITER_VIRTUAL_NAMES | MAILBOX_LIST_ITER_NO_AUTO_INBOX | MAILBOX_LIST_ITER_RETURN_NO_FLAGS; struct mail_search_args *search_args; @@ -85,6 +86,7 @@ void cmd_altmove(struct mail_user *user, const char *const args[]) struct mail_namespace *ns, *prev_ns = NULL; struct mailbox *box; ARRAY_DEFINE(purged_storages, struct mail_storage *); + const char *storage_name; struct mail_storage *const *storages; unsigned int i, count; @@ -94,7 +96,7 @@ void cmd_altmove(struct mail_user *user, const char *const args[]) t_array_init(&purged_storages, 8); iter = doveadm_mail_list_iter_init(user, search_args, iter_flags); - while ((info = doveadm_mail_list_iter_next(iter)) != NULL) { + while ((info = doveadm_mail_list_iter_next(iter)) != NULL) T_BEGIN { if (info->ns != prev_ns) { if (prev_ns != NULL) { ns_purge(prev_ns); @@ -104,12 +106,14 @@ void cmd_altmove(struct mail_user *user, const char *const args[]) prev_ns = info->ns; } - box = mailbox_alloc(info->ns->list, info->name, + storage_name = mail_namespace_get_storage_name(info->ns, + info->name); + box = mailbox_alloc(info->ns->list, storage_name, MAILBOX_FLAG_KEEP_RECENT | MAILBOX_FLAG_IGNORE_ACLS); (void)cmd_altmove_box(box, search_args); mailbox_free(&box); - } + } T_END; doveadm_mail_list_iter_deinit(&iter); /* make sure all private storages have been purged */ diff --git a/src/doveadm/doveadm-mail-list-iter.c b/src/doveadm/doveadm-mail-list-iter.c index 4099cf194f..6f3e7057e7 100644 --- a/src/doveadm/doveadm-mail-list-iter.c +++ b/src/doveadm/doveadm-mail-list-iter.c @@ -13,7 +13,6 @@ struct doveadm_mail_list_iter { enum mailbox_list_iter_flags iter_flags; struct mailbox_list_iterate_context *iter; - string_t *vname; }; static void @@ -52,6 +51,8 @@ doveadm_mail_list_iter_init(struct mail_user *user, struct doveadm_mail_list_iter *iter; ARRAY_TYPE(const_string) patterns; + i_assert((iter_flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0); + iter = i_new(struct doveadm_mail_list_iter, 1); iter->search_args = search_args; @@ -70,7 +71,6 @@ doveadm_mail_list_iter_init(struct mail_user *user, array_idx(&patterns, 0), NAMESPACE_PRIVATE, iter_flags); - iter->vname = str_new(default_pool, 256); return iter; } @@ -82,7 +82,6 @@ void doveadm_mail_list_iter_deinit(struct doveadm_mail_list_iter **_iter) if (mailbox_list_iter_deinit(&iter->iter) < 0) i_error("Listing mailboxes failed"); - str_free(&iter->vname); i_free(iter); } @@ -90,17 +89,10 @@ const struct mailbox_info * doveadm_mail_list_iter_next(struct doveadm_mail_list_iter *iter) { const struct mailbox_info *info; - const char *vname; while ((info = mailbox_list_iter_next(iter->iter)) != NULL) { - if ((iter->iter_flags & MAILBOX_LIST_ITER_VIRTUAL_NAMES) != 0) - vname = info->name; - else { - vname = mail_namespace_get_vname(info->ns, iter->vname, - info->name); - } - if (mail_search_args_match_mailbox(iter->search_args, vname, - info->ns->sep)) + if (mail_search_args_match_mailbox(iter->search_args, + info->name, info->ns->sep)) break; } return info;