diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 02095192b9..be6a199c8a 100644 --- a/src/lib-storage/list/mailbox-list-index-backend.c +++ b/src/lib-storage/list/mailbox-list-index-backend.c @@ -114,7 +114,6 @@ index_list_get_path(struct mailbox_list *_list, const char *name, enum mailbox_list_path_type type, const char **path_r) { struct index_mailbox_list *list = (struct index_mailbox_list *)_list; - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_list); struct mail_index_view *view; struct mailbox_list_index_node *node; struct mailbox_status status; @@ -152,6 +151,10 @@ index_list_get_path(struct mailbox_list *_list, const char *name, return 1; } + /* ilist is only required from this point onwards. + At least imapc calls index_list_get_path without this context*/ + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(_list); + if (ilist->sync_ctx != NULL) { /* we could get here during sync from index_list_mailbox_create_selectable() */ @@ -282,7 +285,7 @@ index_list_mailbox_create_selectable(struct mailbox *box, { struct index_mailbox_list *list = (struct index_mailbox_list *)box->list; - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_list_index_sync_context *sync_ctx; struct mailbox_list_index_record rec; struct mailbox_list_index_node *node; @@ -586,7 +589,7 @@ static int index_list_mailbox_open(struct mailbox *box) void mailbox_list_index_backend_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); if ((flags & MAILBOX_SYNC_FLAG_FORCE_RESYNC) != 0 && !ilist->force_resynced) { @@ -603,7 +606,7 @@ void mailbox_list_index_backend_sync_init(struct mailbox *box, int mailbox_list_index_backend_sync_deinit(struct mailbox *box) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); if (ilist->force_resync_failed) { /* fail this only once */ diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index 4f6a20ec6d..c3387583f8 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -11,7 +11,7 @@ static bool iter_use_index(struct mailbox_list *list, enum mailbox_list_iter_flags flags) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); if ((flags & MAILBOX_LIST_ITER_SELECT_SUBSCRIBED) != 0) { /* for now we don't use indexes when listing subscriptions, @@ -37,7 +37,7 @@ mailbox_list_index_iter_init(struct mailbox_list *list, const char *const *patterns, enum mailbox_list_iter_flags flags) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_iterate_context *ctx; pool_t pool; char ns_sep = mail_namespace_get_sep(list->ns); @@ -178,7 +178,7 @@ iter_subscriptions_ok(struct mailbox_list_index_iterate_context *ctx) const struct mailbox_info * mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(_ctx->list); if (!_ctx->index_iteration) { /* index isn't being used */ return ilist->module_ctx.super.iter_next(_ctx); @@ -225,7 +225,7 @@ mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx) int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(_ctx->list); if (!_ctx->index_iteration) return ilist->module_ctx.super.iter_deinit(_ctx); diff --git a/src/lib-storage/list/mailbox-list-index-notify.c b/src/lib-storage/list/mailbox-list-index-notify.c index df911a0968..6e374727dd 100644 --- a/src/lib-storage/list/mailbox-list-index-notify.c +++ b/src/lib-storage/list/mailbox-list-index-notify.c @@ -209,7 +209,7 @@ notify_lookup_guid(struct mailbox_list_notify_index *inotify, struct mailbox_status *status_r, guid_128_t guid_r) { struct mailbox_list_index *ilist = - INDEX_LIST_CONTEXT(inotify->notify.list); + INDEX_LIST_CONTEXT_REQUIRE(inotify->notify.list); struct mailbox_list_index_node *index_node; uint32_t seq; @@ -311,7 +311,7 @@ static int mailbox_list_index_notify_read_next(struct mailbox_list_notify_index *inotify) { struct mailbox_list_notify *notify = &inotify->notify; - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(notify->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(notify->list); const struct mail_transaction_header *hdr; const void *data; int ret; diff --git a/src/lib-storage/list/mailbox-list-index-status.c b/src/lib-storage/list/mailbox-list-index-status.c index 937e6afcc1..ee7f468509 100644 --- a/src/lib-storage/list/mailbox-list-index-status.c +++ b/src/lib-storage/list/mailbox-list-index-status.c @@ -36,7 +36,7 @@ static int index_list_open_view(struct mailbox *box, bool status_check, struct mail_index_view **view_r, uint32_t *seq_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_list_index_node *node; struct mail_index_view *view; uint32_t seq; @@ -121,7 +121,7 @@ bool mailbox_list_index_status(struct mailbox_list *list, uint8_t *mailbox_guid, struct mailbox_index_vsize *vsize_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); const void *data; bool expunged; bool ret = TRUE; @@ -228,7 +228,7 @@ index_list_get_status(struct mailbox *box, enum mailbox_status_items items, static int index_list_get_cached_guid(struct mailbox *box, guid_128_t guid_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_status status; struct mail_index_view *view; uint32_t seq; @@ -252,7 +252,7 @@ index_list_get_cached_guid(struct mailbox *box, guid_128_t guid_r) static int index_list_get_cached_vsize(struct mailbox *box, uoff_t *vsize_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_status status; struct mailbox_index_vsize vsize; struct mail_index_view *view; @@ -286,7 +286,7 @@ static int index_list_get_cached_first_saved(struct mailbox *box, struct mailbox_index_first_saved *first_saved_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mail_index_view *view; struct mailbox_status status; const void *data; @@ -454,7 +454,7 @@ index_list_first_saved_update_changes(struct mailbox *box, struct mail_index_view *list_view, struct index_list_changes *changes) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_index_first_saved first_saved; const void *data; bool expunged; @@ -529,7 +529,7 @@ index_list_update_first_saved(struct mailbox *box, struct mail_index_transaction *list_trans, const struct index_list_changes *changes) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mailbox_transaction_context *t; struct mail *mail; struct mailbox_index_first_saved first_saved; @@ -572,7 +572,7 @@ index_list_update(struct mailbox *box, struct mail_index_view *list_view, struct mail_index_transaction *list_trans, const struct index_list_changes *changes) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); if (changes->rec_changed) { struct mailbox_list_index_record rec; @@ -620,7 +620,7 @@ index_list_update(struct mailbox *box, struct mail_index_view *list_view, static int index_list_update_mailbox(struct mailbox *box) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mail_index_sync_ctx *list_sync_ctx; struct mail_index_view *list_view; struct mail_index_transaction *list_trans; @@ -762,7 +762,7 @@ void mailbox_list_index_status_sync_init(struct mailbox *box) void mailbox_list_index_status_sync_deinit(struct mailbox *box) { struct index_list_mailbox *ibox = INDEX_LIST_STORAGE_CONTEXT(box); - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); const struct mail_index_header *hdr; hdr = mail_index_get_header(box->view); @@ -807,7 +807,7 @@ index_list_transaction_commit(struct mailbox_transaction_context *t, void mailbox_list_index_status_set_info_flags(struct mailbox *box, uint32_t uid, enum mailbox_info_flags *flags) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(box->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(box->list); struct mail_index_view *view; struct mailbox_status status; uint32_t seq; @@ -849,7 +849,7 @@ void mailbox_list_index_status_init_mailbox(struct mailbox_vfuncs *v) void mailbox_list_index_status_init_finish(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); ilist->msgs_ext_id = mail_index_ext_register(ilist->index, "msgs", 0, sizeof(struct mailbox_list_index_msgs_record), diff --git a/src/lib-storage/list/mailbox-list-index-sync.c b/src/lib-storage/list/mailbox-list-index-sync.c index e51a07c46f..700d18ac0f 100644 --- a/src/lib-storage/list/mailbox-list-index-sync.c +++ b/src/lib-storage/list/mailbox-list-index-sync.c @@ -225,7 +225,7 @@ sync_expunge_nonexistent(struct mailbox_list_index_sync_context *sync_ctx, int mailbox_list_index_sync_begin(struct mailbox_list *list, struct mailbox_list_index_sync_context **sync_ctx_r) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_sync_context *sync_ctx; struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *view; diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 533fa2a863..0fcd750d66 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -25,7 +25,7 @@ struct mailbox_list_index_module mailbox_list_index_module = void mailbox_list_index_set_index_error(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); mailbox_list_set_internal_error(list); mail_index_reset_error(ilist->index); @@ -54,7 +54,7 @@ void mailbox_list_index_reset(struct mailbox_list_index *ilist) int mailbox_list_index_index_open(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); const struct mail_storage_settings *set = list->mail_set; enum mail_index_open_flags index_flags; unsigned int lock_timeout; @@ -128,7 +128,7 @@ mailbox_list_index_node_find_sibling(struct mailbox_list_index_node *node, static struct mailbox_list_index_node * mailbox_list_index_lookup_real(struct mailbox_list *list, const char *name) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_node *node = ilist->mailbox_tree; const char *const *path; unsigned int i; @@ -433,7 +433,7 @@ static int mailbox_list_index_parse_records(struct mailbox_list_index *ilist, int mailbox_list_index_parse(struct mailbox_list *list, struct mail_index_view *view, bool force) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); const struct mail_index_header *hdr; const char *error; @@ -495,7 +495,7 @@ bool mailbox_list_index_need_refresh(struct mailbox_list_index *ilist, int mailbox_list_index_refresh(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); if (ilist->syncing) return 0; @@ -513,7 +513,7 @@ int mailbox_list_index_refresh(struct mailbox_list *list) int mailbox_list_index_refresh_force(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mail_index_view *view; int ret; bool refresh; @@ -545,7 +545,7 @@ int mailbox_list_index_refresh_force(struct mailbox_list *list) static void mailbox_list_index_refresh_timeout(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); timeout_remove(&ilist->to_refresh); (void)mailbox_list_index_refresh(list); @@ -553,7 +553,7 @@ static void mailbox_list_index_refresh_timeout(struct mailbox_list *list) void mailbox_list_index_refresh_later(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_header new_hdr; struct mail_index_view *view; struct mail_index_transaction *trans; @@ -610,7 +610,7 @@ list_handle_corruption_locked(struct mailbox_list *list, int mailbox_list_index_handle_corruption(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); enum mail_storage_list_index_rebuild_reason reason; int ret; @@ -644,7 +644,7 @@ int mailbox_list_index_handle_corruption(struct mailbox_list *list) int mailbox_list_index_set_uncorrupted(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_sync_context *sync_ctx; ilist->call_corruption_callback = FALSE; @@ -659,7 +659,7 @@ int mailbox_list_index_set_uncorrupted(struct mailbox_list *list) static void mailbox_list_index_deinit(struct mailbox_list *list) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); timeout_remove(&ilist->to_refresh); if (ilist->index != NULL) { @@ -677,7 +677,7 @@ static void mailbox_list_index_refresh_if_found(struct mailbox_list *list, const char *name, bool selectable) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); struct mailbox_list_index_node *node; if (ilist->syncing) @@ -699,7 +699,7 @@ mailbox_list_index_refresh_if_found(struct mailbox_list *list, static void mailbox_list_index_refresh_if_not_found(struct mailbox_list *list, const char *name) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); if (ilist->syncing) return; @@ -760,7 +760,7 @@ mailbox_list_index_update_mailbox(struct mailbox *box, static int mailbox_list_index_delete_mailbox(struct mailbox_list *list, const char *name) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); if (ilist->module_ctx.super.delete_mailbox(list, name) < 0) { if (mailbox_list_get_last_mail_error(list) == MAIL_ERROR_NOTFOUND) @@ -774,7 +774,7 @@ mailbox_list_index_delete_mailbox(struct mailbox_list *list, const char *name) static int mailbox_list_index_delete_dir(struct mailbox_list *list, const char *name) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(list); if (ilist->module_ctx.super.delete_dir(list, name) < 0) { if (mailbox_list_get_last_mail_error(list) == MAIL_ERROR_NOTFOUND) @@ -791,7 +791,7 @@ mailbox_list_index_rename_mailbox(struct mailbox_list *oldlist, struct mailbox_list *newlist, const char *newname) { - struct mailbox_list_index *oldilist = INDEX_LIST_CONTEXT(oldlist); + struct mailbox_list_index *oldilist = INDEX_LIST_CONTEXT_REQUIRE(oldlist); if (oldilist->module_ctx.super.rename_mailbox(oldlist, oldname, newlist, newname) < 0) { @@ -811,7 +811,7 @@ static int mailbox_list_index_set_subscribed(struct mailbox_list *_list, const char *name, bool set) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(_list); struct mail_index_view *view; struct mail_index_transaction *trans; const void *data; diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 660b653e24..22bb82ce49 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -33,6 +33,8 @@ #define INDEX_LIST_CONTEXT(obj) \ MODULE_CONTEXT(obj, mailbox_list_index_module) +#define INDEX_LIST_CONTEXT_REQUIRE(obj) \ + MODULE_CONTEXT_REQUIRE(obj, mailbox_list_index_module) struct mail_index_view; struct mailbox_index_vsize; diff --git a/src/lib-storage/list/mailbox-list-notify-tree.c b/src/lib-storage/list/mailbox-list-notify-tree.c index 52a11ce495..956cec5896 100644 --- a/src/lib-storage/list/mailbox-list-notify-tree.c +++ b/src/lib-storage/list/mailbox-list-notify-tree.c @@ -78,7 +78,7 @@ mailbox_list_notify_node_build(struct mailbox_list_notify_tree *tree, static void mailbox_list_notify_tree_build(struct mailbox_list_notify_tree *tree) { - struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(tree->list); + struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT_REQUIRE(tree->list); struct mailbox_list_index_node *index_node; string_t *path = t_str_new(128);