]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fix mailbox list index hook usage
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 9 Feb 2017 14:34:52 +0000 (16:34 +0200)
committerGitLab <gitlab@git.dovecot.net>
Tue, 14 Feb 2017 12:57:34 +0000 (14:57 +0200)
The previous method appeared to work, but not if the internal hooks were
used more than once.

src/lib-storage/list/mailbox-list-index-backend.c
src/lib-storage/list/mailbox-list-index-status.c
src/lib-storage/list/mailbox-list-index.c
src/lib-storage/list/mailbox-list-index.h

index 91aa756db705b27c2a10dc6a3fc30d7a328a7363..c1045e276d15ea3295af6cc7cc63f7a770b3b19a 100644 (file)
@@ -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;
 }
index e4266407984f7856d286b79459c90114ee8fbfdb..89f7942750ad6f605c11905a2e92f6d04707d2e6 100644 (file)
@@ -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)
index fadb5bb6bf7fa581a8b6df42646172a2a65665c7..1e8c4cba163c18685f3eee40b3b401b9161eaf3a 100644 (file)
@@ -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 = {
index 1073a0d7deb356e96b67855728465fef40efca4d..2284f3af888d39e845ebb83dea92528064c5bc42 100644 (file)
@@ -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