]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mailbox_list_index_handle_corruption() - Lock mailbox list while rebuilding
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 19 Feb 2018 10:54:53 +0000 (12:54 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 19 Feb 2018 20:08:04 +0000 (22:08 +0200)
This guards against simultaneous mailbox create/delete/rename.

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

index 5b555accea6afe6ee84e347be528add6fb4f2bf2..45fe9bfe45970edfa103e335075668cbfddaaf05 100644 (file)
@@ -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;
 }