From: Timo Sirainen Date: Mon, 11 Jul 2016 08:28:10 +0000 (+0300) Subject: lib-storage: Fixed crash on subscription listing if subscription refresh fails. X-Git-Tag: 2.3.0.rc1~3314 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a1943bdb8253072c6856ca96348f1fc087f8e7c6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Fixed crash on subscription listing if subscription refresh fails. --- diff --git a/src/lib-storage/list/mailbox-list-iter.c b/src/lib-storage/list/mailbox-list-iter.c index b01774d348..49974d78eb 100644 --- a/src/lib-storage/list/mailbox-list-iter.c +++ b/src/lib-storage/list/mailbox-list-iter.c @@ -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); }