From: Timo Sirainen Date: Thu, 9 Feb 2017 14:34:52 +0000 (+0200) Subject: lib-storage: Fix mailbox list index hook usage X-Git-Tag: 2.2.28.rc1~104 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9fbca088270bbd901ae7264d20a6581be896e5d2;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Fix mailbox list index hook usage The previous method appeared to work, but not if the internal hooks were used more than once. --- diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 4a48d2e157..fa07462ebf 100644 --- a/src/lib-storage/list/mailbox-list-index-backend.c +++ b/src/lib-storage/list/mailbox-list-index-backend.c @@ -849,12 +849,13 @@ struct mailbox_list index_mailbox_list = { } }; -void mailbox_list_index_backend_init_mailbox(struct mailbox *box) +void mailbox_list_index_backend_init_mailbox(struct mailbox *box, + struct mailbox_vfuncs *v) { if (strcmp(box->list->name, MAILBOX_LIST_NAME_INDEX) != 0) return; - box->v.create_box = index_list_mailbox_create; - box->v.update_box = index_list_mailbox_update; - box->v.exists = index_list_mailbox_exists; - box->v.open = index_list_mailbox_open; + v->create_box = index_list_mailbox_create; + v->update_box = index_list_mailbox_update; + v->exists = index_list_mailbox_exists; + v->open = index_list_mailbox_open; } diff --git a/src/lib-storage/list/mailbox-list-index-status.c b/src/lib-storage/list/mailbox-list-index-status.c index 2ab557c5aa..bff0aa5aad 100644 --- a/src/lib-storage/list/mailbox-list-index-status.c +++ b/src/lib-storage/list/mailbox-list-index-status.c @@ -822,13 +822,13 @@ void mailbox_list_index_status_set_info_flags(struct mailbox *box, uint32_t uid, *flags |= MAILBOX_UNMARKED; } -void mailbox_list_index_status_init_mailbox(struct mailbox *box) +void mailbox_list_index_status_init_mailbox(struct mailbox_vfuncs *v) { - box->v.exists = index_list_exists; - box->v.get_status = index_list_get_status; - box->v.get_metadata = index_list_get_metadata; - box->v.sync_deinit = index_list_sync_deinit; - box->v.transaction_commit = index_list_transaction_commit; + v->exists = index_list_exists; + v->get_status = index_list_get_status; + v->get_metadata = index_list_get_metadata; + v->sync_deinit = index_list_sync_deinit; + v->transaction_commit = index_list_transaction_commit; } void mailbox_list_index_status_init_finish(struct mailbox_list *list) diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index fadb5bb6bf..1e8c4cba16 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -810,6 +810,7 @@ mailbox_list_index_namespaces_added(struct mail_namespace *namespaces) static void mailbox_list_index_mailbox_allocated(struct mailbox *box) { + struct mailbox_vfuncs *v = box->vlast; struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); struct index_list_mailbox *ibox; @@ -817,15 +818,16 @@ static void mailbox_list_index_mailbox_allocated(struct mailbox *box) return; ibox = p_new(box->pool, struct index_list_mailbox, 1); - ibox->module_ctx.super = box->v; + ibox->module_ctx.super = *v; + box->vlast = &ibox->module_ctx.super; MODULE_CONTEXT_SET(box, index_list_storage_module, ibox); /* for layout=index these get overridden */ - box->v.create_box = mailbox_list_index_create_mailbox; - box->v.update_box = mailbox_list_index_update_mailbox; + v->create_box = mailbox_list_index_create_mailbox; + v->update_box = mailbox_list_index_update_mailbox; - mailbox_list_index_status_init_mailbox(box); - mailbox_list_index_backend_init_mailbox(box); + mailbox_list_index_status_init_mailbox(v); + mailbox_list_index_backend_init_mailbox(box, v); } static struct mail_storage_hooks mailbox_list_index_hooks = { diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 5cb73b255a..491191da80 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -36,6 +36,7 @@ struct mail_index_view; struct mailbox_index_vsize; +struct mailbox_vfuncs; /* stored in mail_index_record.flags: */ enum mailbox_list_index_flags { @@ -196,8 +197,9 @@ void mailbox_list_index_notify_wait(struct mailbox_list_notify *notify, void (*callback)(void *context), void *context); -void mailbox_list_index_status_init_mailbox(struct mailbox *box); -void mailbox_list_index_backend_init_mailbox(struct mailbox *box); +void mailbox_list_index_status_init_mailbox(struct mailbox_vfuncs *v); +void mailbox_list_index_backend_init_mailbox(struct mailbox *box, + struct mailbox_vfuncs *v); void mailbox_list_index_status_init_finish(struct mailbox_list *list); #endif