From: Timo Sirainen Date: Thu, 24 Sep 2015 16:07:12 +0000 (+0300) Subject: virtual plugin: Fixed assert-crash when closing a virtual mailbox consisting of many... X-Git-Tag: 2.2.19.rc2~37 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2;p=thirdparty%2Fdovecot%2Fcore.git virtual plugin: Fixed assert-crash when closing a virtual mailbox consisting of many real mailboxes. --- diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index 792db49d52..37d520d480 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -325,12 +325,15 @@ virtual_backend_box_close_any_except(struct virtual_mailbox *mbox, void virtual_backend_box_opened(struct virtual_mailbox *mbox, struct virtual_backend_box *bbox) { + i_assert(!bbox->open_tracked); + /* the backend mailbox was already opened. if we didn't get here from virtual_backend_box_open() we may need to close a mailbox */ while (mbox->backends_open_count > mbox->storage->max_open_mailboxes && virtual_backend_box_close_any_except(mbox, bbox)) ; + bbox->open_tracked = TRUE; mbox->backends_open_count++; DLLIST2_APPEND_FULL(&mbox->open_backend_boxes_head, &mbox->open_backend_boxes_tail, bbox, @@ -367,12 +370,21 @@ void virtual_backend_box_close(struct virtual_mailbox *mbox, mail_search_args_deinit(bbox->search_args); bbox->search_args_initialized = FALSE; } - i_assert(mbox->backends_open_count > 0); - mbox->backends_open_count--; - - DLLIST2_REMOVE_FULL(&mbox->open_backend_boxes_head, - &mbox->open_backend_boxes_tail, bbox, - prev_open, next_open); + if (bbox->open_tracked) { + i_assert(mbox->backends_open_count > 0); + mbox->backends_open_count--; + bbox->open_tracked = FALSE; + + DLLIST2_REMOVE_FULL(&mbox->open_backend_boxes_head, + &mbox->open_backend_boxes_tail, bbox, + prev_open, next_open); + } else { + /* mailbox can be leaked outside our code via + virtual_get_virtual_backend_boxes() and it could have + been opened there. FIXME: maybe we could hook into the + backend open/close functions to do the tracking and + auto-closing. */ + } mailbox_close(bbox->box); } diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 62bbeb0f66..10d0dd3884 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -97,6 +97,7 @@ struct virtual_backend_box { struct imap_match_glob *glob; struct mail_namespace *ns; + unsigned int open_tracked:1; unsigned int open_failed:1; unsigned int sync_seen:1; unsigned int wildcard:1;