]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm altmove: Fixed assert-crashing
authorTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2010 19:25:33 +0000 (22:25 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 28 Apr 2010 19:25:33 +0000 (22:25 +0300)
--HG--
branch : HEAD

src/doveadm/doveadm-mail-altmove.c
src/doveadm/doveadm-mail-list-iter.c

index e3eed103e81787ca0fd9a67f4bfb09a0f6d57ecd..12f0ad03d96f30fa9f7ac5ee0c57fb2d78853bc4 100644 (file)
@@ -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 */
index 4099cf194f9952fd9883de50fd59bcc9305814c0..6f3e7057e7bff771647da7b78914cdd3fd3a1b1d 100644 (file)
@@ -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;