changeset 20516:5bef6977c15e

lib-storage: Fixed crash on subscription listing if subscription refresh fails.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 11 Jul 2016 11:28:10 +0300
parents 84cd7e08e8d6
children c4a1368cd868
files src/lib-storage/list/mailbox-list-iter.c
diffstat 1 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-iter.c	Sat Jul 09 20:11:45 2016 +0300
+++ b/src/lib-storage/list/mailbox-list-iter.c	Mon Jul 11 11:28:10 2016 +0300
@@ -57,6 +57,8 @@
 				       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 @@
 	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 @@
 {
 	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 @@
 
 	*_ctx = NULL;
 
+	if (ctx == &mailbox_list_iter_failed)
+		return -1;
 	return ctx->list->v.iter_deinit(ctx);
 }