]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mailbox-list-iter - Refresh subscriptions before setting flags
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 20 Nov 2017 11:40:03 +0000 (13:40 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Sat, 9 Dec 2017 16:37:41 +0000 (18:37 +0200)
This happens when list patterns match the namespace prefix,
but mailbox_list_ns_match_patterns() returns FALSE. And one of the ways for
that to happen is if namespace has alias_for set.

src/lib-storage/list/mailbox-list-iter.c

index 01110ac70b1725d15e12c6c3aaf7a2c518854a61..72bce8f568f7a6d4e1e0d8c79b36d8548ef357e3 100644 (file)
@@ -37,6 +37,7 @@ struct ns_list_iterate_context {
        bool inbox_listed:1;
 };
 
+static void mailbox_list_ns_iter_failed(struct ns_list_iterate_context *ctx);
 static bool ns_match_next(struct ns_list_iterate_context *ctx, 
                          struct mail_namespace *ns, const char *pattern);
 static int mailbox_list_match_anything(struct ns_list_iterate_context *ctx,
@@ -470,6 +471,13 @@ mailbox_list_ns_prefix_return(struct ns_list_iterate_context *ctx,
 
        if ((ctx->ctx.flags & (MAILBOX_LIST_ITER_RETURN_SUBSCRIBED |
                               MAILBOX_LIST_ITER_SELECT_SUBSCRIBED)) != 0) {
+               /* Refresh subscriptions first, this won't cause a duplicate
+                  call later on as this is only called when the namespace's
+                  children definitely don't match */
+               if (mailbox_list_iter_subscriptions_refresh(ns->list) < 0) {
+                       mailbox_list_ns_iter_failed(ctx);
+                       return FALSE;
+               }
                mailbox_list_set_subscription_flags(ns->list,
                                                    ctx->ns_info.vname,
                                                    &ctx->ns_info.flags);