]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Fix leaking mail_index_view on delayed expunge handling
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 17 Jan 2018 13:05:38 +0000 (15:05 +0200)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 18 Jan 2018 07:12:31 +0000 (09:12 +0200)
Fixes:
Panic: Leaked view for index (in-memory index): Opened in imapc-mailbox.c:47

src/lib-storage/index/imapc/imapc-mailbox.c
src/lib-storage/index/imapc/imapc-sync.c

index 5a18b899adcfc6abba7119883cd58fb8c801b08d..72053db3de82d97aa66538aaf9022c381dcf0d85 100644 (file)
@@ -110,15 +110,22 @@ int imapc_mailbox_commit_delayed_trans(struct imapc_mailbox *mbox,
        mbox->delayed_sync_cache_trans = NULL;
        if (mbox->delayed_sync_cache_view != NULL)
                mail_cache_view_close(&mbox->delayed_sync_cache_view);
-       if (mbox->sync_view != NULL)
-               mail_index_view_close(&mbox->sync_view);
 
        if (array_count(&mbox->delayed_expunged_uids) > 0) {
                /* delayed expunges - commit them now in a separate
-                  transaction */
+                  transaction. Reopen mbox->sync_view to see changes
+                  committed in delayed_sync_trans. */
+               if (mbox->sync_view != NULL)
+                       mail_index_view_close(&mbox->sync_view);
                if (imapc_mailbox_commit_delayed_expunges(mbox) < 0)
                        ret = -1;
        }
+
+       if (mbox->sync_view != NULL)
+               mail_index_view_close(&mbox->sync_view);
+       i_assert(mbox->delayed_sync_trans == NULL);
+       i_assert(mbox->delayed_sync_view == NULL);
+       i_assert(mbox->delayed_sync_cache_trans == NULL);
        return ret;
 }
 
index 6637373bca00df3b7fd628a3fa64a3b8eed05e18..23b67dea9486a72c39787473c2b774ddb19964c2 100644 (file)
@@ -563,6 +563,7 @@ imapc_sync_begin(struct imapc_mailbox *mbox,
                return ret;
        }
 
+       i_assert(mbox->sync_view == NULL);
        i_assert(mbox->delayed_sync_trans == NULL);
        mbox->sync_view = ctx->sync_view;
        mbox->delayed_sync_view =