From: Timo Sirainen Date: Wed, 9 Dec 2015 13:31:37 +0000 (+0200) Subject: virtual: Fixed assert-crash when opening virtual mailbox triggered backend mailbox... X-Git-Tag: 2.2.22.rc1~421 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a18335e18aac7fc219b6f18dde083359155cc524;p=thirdparty%2Fdovecot%2Fcore.git virtual: Fixed assert-crash when opening virtual mailbox triggered backend mailbox autocreation. Fixes assert: Panic: file virtual-storage.c: line 335 (virtual_mailbox_opened_hook): assertion failed: (!bbox->open_tracked) --- diff --git a/src/plugins/virtual/virtual-plugin.c b/src/plugins/virtual/virtual-plugin.c index 946328ab45..027b6a612c 100644 --- a/src/plugins/virtual/virtual-plugin.c +++ b/src/plugins/virtual/virtual-plugin.c @@ -8,7 +8,8 @@ const char *virtual_plugin_version = DOVECOT_ABI_VERSION; static struct mail_storage_hooks acl_mail_storage_hooks = { - .mailbox_opened = virtual_mailbox_opened_hook + .mailbox_allocated = virtual_backend_mailbox_allocated, + .mailbox_opened = virtual_backend_mailbox_opened }; void virtual_plugin_init(struct module *module ATTR_UNUSED) diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index 5b7f74474c..58abbf68ef 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -22,12 +22,21 @@ #define VIRTUAL_DEFAULT_MAX_OPEN_MAILBOXES 64 +#define VIRTUAL_BACKEND_CONTEXT(obj) \ + MODULE_CONTEXT(obj, virtual_backend_storage_module) + +struct virtual_backend_mailbox { + union mailbox_module_context module_ctx; +}; + extern struct mail_storage virtual_storage; extern struct mailbox virtual_mailbox; extern struct virtual_mailbox_vfuncs virtual_mailbox_vfuncs; struct virtual_storage_module virtual_storage_module = MODULE_CONTEXT_INIT(&mail_storage_module_register); +static MODULE_CONTEXT_DEFINE_INIT(virtual_backend_storage_module, + &mail_storage_module_register); static bool ns_is_visible(struct mail_namespace *ns) { @@ -323,7 +332,32 @@ virtual_backend_box_close_any_except(struct virtual_mailbox *mbox, return FALSE; } -void virtual_mailbox_opened_hook(struct mailbox *box) +static void virtual_backend_mailbox_close(struct mailbox *box) +{ + struct virtual_backend_box *bbox = VIRTUAL_CONTEXT(box); + struct virtual_backend_mailbox *vbox = VIRTUAL_BACKEND_CONTEXT(box); + + if (bbox != NULL && bbox->open_tracked) { + /* we could have gotten here from e.g. mailbox_autocreate() + without going through virtual_mailbox_close() */ + virtual_backend_box_close(bbox->virtual_mbox, bbox); + } + vbox->module_ctx.super.close(box); +} + +void virtual_backend_mailbox_allocated(struct mailbox *box) +{ + struct mailbox_vfuncs *v = box->vlast; + struct virtual_backend_mailbox *vbox; + + vbox = p_new(box->pool, struct virtual_backend_mailbox, 1); + vbox->module_ctx.super = *v; + box->vlast = &vbox->module_ctx.super; + v->close = virtual_backend_mailbox_close; + MODULE_CONTEXT_SET(box, virtual_backend_storage_module, vbox); +} + +void virtual_backend_mailbox_opened(struct mailbox *box) { struct virtual_backend_box *bbox = VIRTUAL_CONTEXT(box); struct virtual_mailbox *mbox; diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index dfa16fc859..520dfea12b 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -225,6 +225,7 @@ void virtual_save_free(struct mail_save_context *ctx); void virtual_box_copy_error(struct mailbox *dest, struct mailbox *src); -void virtual_mailbox_opened_hook(struct mailbox *box); +void virtual_backend_mailbox_allocated(struct mailbox *box); +void virtual_backend_mailbox_opened(struct mailbox *box); #endif