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.3.0.rc1~2120 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58289301ce9f6aa7121891e33ef7e0a1b4559e8d;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 91aa756db7..c1045e276d 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 e426640798..89f7942750 100644 --- a/src/lib-storage/list/mailbox-list-index-status.c +++ b/src/lib-storage/list/mailbox-list-index-status.c @@ -819,13 +819,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 1073a0d7de..2284f3af88 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