]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fail mailbox list iteration early if it fails to get INBOX flags
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 12 Jun 2017 11:33:46 +0000 (14:33 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 12 Jun 2017 13:23:59 +0000 (16:23 +0300)
The resulting INBOX reply could be wrong in that case.

Also with imapc if the remote server is down, this causes two connection
errors instead of just one.

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

index 6ec7a2eba17329745479ba012cf2ced1650f74c8..01110ac70b1725d15e12c6c3aaf7a2c518854a61 100644 (file)
@@ -707,17 +707,19 @@ patterns_match_inbox(struct mail_namespace *namespaces,
        return imap_match(glob, "INBOX") == IMAP_MATCH_YES;
 }
 
-static void inbox_info_init(struct ns_list_iterate_context *ctx,
-                           struct mail_namespace *namespaces)
+static int inbox_info_init(struct ns_list_iterate_context *ctx,
+                          struct mail_namespace *namespaces)
 {
        enum mailbox_info_flags flags;
+       int ret;
 
        ctx->inbox_info.vname = "INBOX";
        ctx->inbox_info.ns = mail_namespace_find_inbox(namespaces);
        i_assert(ctx->inbox_info.ns != NULL);
 
-       if (mailbox_list_mailbox(ctx->inbox_info.ns->list, "INBOX", &flags) > 0)
+       if ((ret = mailbox_list_mailbox(ctx->inbox_info.ns->list, "INBOX", &flags)) > 0)
                ctx->inbox_info.flags = flags;
+       return ret;
 }
 
 struct mailbox_list_iterate_context *
@@ -754,7 +756,10 @@ mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
                   else called INBOX (e.g. namespace prefix) we can show it
                   immediately with the proper flags. */
                ctx->inbox_list = TRUE;
-               inbox_info_init(ctx, namespaces);
+               if (inbox_info_init(ctx, namespaces) < 0) {
+                       pool_unref(&pool);
+                       return &mailbox_list_iter_failed;
+               }
        }
 
        if ((flags & MAILBOX_LIST_ITER_STAR_WITHIN_NS) != 0) {