]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fixed crash on subscription listing if subscription refresh fails.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 08:28:10 +0000 (11:28 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 11 Jul 2016 10:51:26 +0000 (13:51 +0300)
src/lib-storage/list/mailbox-list-iter.c

index b01774d348a675722cec6781e7ee552a75012750..49974d78eba0d599c7d2aaaceeaa089d7c6a2c1c 100644 (file)
@@ -57,6 +57,8 @@ static int mailbox_list_match_anything(struct ns_list_iterate_context *ctx,
                                       struct mail_namespace *ns,
                                       const char *prefix);
 
+static struct mailbox_list_iterate_context mailbox_list_iter_failed;
+
 struct mailbox_list_iterate_context *
 mailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
                       enum mailbox_list_iter_flags flags)
@@ -167,8 +169,11 @@ mailbox_list_iter_init_multiple(struct mailbox_list *list,
        i_assert(*patterns != NULL);
 
        if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED |
-                     MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0)
+                     MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0) {
                ret = mailbox_list_iter_subscriptions_refresh(list);
+               if (ret < 0)
+                       return &mailbox_list_iter_failed;
+       }
 
        ctx = list->v.iter_init(list, patterns, flags);
        if (ret < 0)
@@ -1022,6 +1027,8 @@ mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
 {
        const struct mailbox_info *info;
 
+       if (ctx == &mailbox_list_iter_failed)
+               return NULL;
        do {
                T_BEGIN {
                        if (ctx->autocreate_ctx != NULL)
@@ -1039,6 +1046,8 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
 
        *_ctx = NULL;
 
+       if (ctx == &mailbox_list_iter_failed)
+               return -1;
        return ctx->list->v.iter_deinit(ctx);
 }