From 559a54ed72660c91d88101e34d757eea902f438e Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 19 Feb 2018 12:54:53 +0200 Subject: [PATCH] lib-storage: mailbox_list_index_handle_corruption() - Lock mailbox list while rebuilding This guards against simultaneous mailbox create/delete/rename. --- src/lib-storage/list/mailbox-list-index.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 5b555accea..45fe9bfe45 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -627,7 +627,18 @@ int mailbox_list_index_handle_corruption(struct mailbox_list *list) return 0; ilist->handling_corruption = TRUE; - ret = list_handle_corruption_locked(list, reason); + /* Perform the rebuilding locked. Note that if we're here because + INBOX wasn't found, this may be because another process is in the + middle of creating it. Waiting for the lock here makes sure that + we don't start rebuilding before it's finished. In that case the + rebuild is a bit unnecessary, but harmless (and avoiding the rebuild + just adds extra code complexity). */ + if (mailbox_list_lock(list) < 0) + ret = -1; + else { + ret = list_handle_corruption_locked(list, reason); + mailbox_list_unlock(list); + } ilist->handling_corruption = FALSE; return ret; }