From da0b85092a337d8e74ad1a3e4043ee9b210cc2f2 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Wed, 17 May 2017 12:16:31 +0300 Subject: [PATCH] lib-storage: Do not drop autocreate boxes when listing them Otherwise we skip folders, because array_delete() is removing boxes while they're being iterated. --- src/lib-storage/list/mailbox-list-iter.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib-storage/list/mailbox-list-iter.c b/src/lib-storage/list/mailbox-list-iter.c index 9972db1de5..63e9d0f024 100644 --- a/src/lib-storage/list/mailbox-list-iter.c +++ b/src/lib-storage/list/mailbox-list-iter.c @@ -31,6 +31,7 @@ struct mailbox_list_autocreate_iterate_context { ARRAY(struct autocreate_box) boxes; ARRAY_TYPE(mailbox_settings) box_sets; ARRAY_TYPE(mailbox_settings) all_ns_box_sets; + bool listing_autoboxes:1; }; struct ns_list_iterate_context { @@ -828,7 +829,8 @@ autocreate_iter_existing(struct mailbox_list_iterate_context *ctx) match = autocreate_box_match(&actx->box_sets, ctx->list->ns, info->vname, FALSE, &idx); - if ((match & AUTOCREATE_MATCH_RESULT_YES) != 0) { + if (!actx->listing_autoboxes && + (match & AUTOCREATE_MATCH_RESULT_YES) != 0) { /* we have an exact match in the list. don't list it at the end. */ array_delete(&actx->boxes, idx, 1); @@ -993,6 +995,9 @@ mailbox_list_iter_default_next(struct mailbox_list_iterate_context *ctx) if (actx == NULL) return NULL; + /* do not drop boxes anymore */ + actx->listing_autoboxes = TRUE; + /* list missing mailboxes */ autoboxes = array_get(&actx->boxes, &count); while (actx->idx < count) {