From: Stephan Bosch Date: Tue, 13 May 2025 23:44:31 +0000 (+0200) Subject: lib-storage: list: mailbox-list-iter - Move info pool to struct mailbox_list_iterate_... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c245edec5e24f51a3538db25ddf21734cb4a6101;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: list: mailbox-list-iter - Move info pool to struct mailbox_list_iterate_context Make info pool available for more general use in mailbox list iteration. --- diff --git a/src/lib-storage/list/mailbox-list-fs-iter.c b/src/lib-storage/list/mailbox-list-fs-iter.c index 456f334ab3..7e5a8be274 100644 --- a/src/lib-storage/list/mailbox-list-fs-iter.c +++ b/src/lib-storage/list/mailbox-list-fs-iter.c @@ -46,7 +46,6 @@ struct fs_list_iterate_context { unsigned int root_idx; char sep; - pool_t info_pool; struct mailbox_info info; /* current directory we're handling */ struct list_dir_context *dir; @@ -526,7 +525,6 @@ fs_list_iter_init(struct mailbox_list *_list, const char *const *patterns, ctx->ctx.flags = flags; array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); - ctx->info_pool = pool_alloconly_create("fs list", 1024); ctx->sep = mail_namespace_get_sep(_list->ns); ctx->info.ns = _list->ns; ctx->ctx.iter_from_index_dir = @@ -567,7 +565,6 @@ int fs_list_iter_deinit(struct mailbox_list_iterate_context *_ctx) } hash_table_destroy(&_ctx->found_mailboxes); - pool_unref(&ctx->info_pool); pool_unref(&_ctx->pool); return ret; } @@ -591,7 +588,7 @@ fs_list_get_inbox_vname(struct fs_list_iterate_context *ctx) if ((ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0) return "INBOX"; else - return p_strconcat(ctx->info_pool, ns->prefix, "INBOX", NULL); + return p_strconcat(ctx->ctx.info_pool, ns->prefix, "INBOX", NULL); } static bool @@ -646,7 +643,7 @@ fs_list_entry(struct fs_list_iterate_context *ctx, storage_name = dir_get_storage_name(dir, entry->fname); vname = mailbox_list_get_vname(ctx->ctx.list, storage_name); - ctx->info.vname = p_strdup(ctx->info_pool, vname); + ctx->info.vname = p_strdup(ctx->ctx.info_pool, vname); ctx->info.flags = entry->info_flags; match = imap_match(ctx->ctx.glob, ctx->info.vname); @@ -769,7 +766,6 @@ fs_list_next(struct fs_list_iterate_context *ctx) /* NOTE: fs_list_entry() may change ctx->dir */ entries = array_get(&ctx->dir->entries, &count); while (ctx->dir->entry_idx < count) { - p_clear(ctx->info_pool); ret = fs_list_entry(ctx, &entries[ctx->dir->entry_idx++]); if (ret > 0) return 1; @@ -790,7 +786,7 @@ fs_list_next(struct fs_list_iterate_context *ctx) !ctx->listed_prefix_inbox) { ctx->info.flags = MAILBOX_CHILDREN | MAILBOX_NOSELECT; ctx->info.vname = - p_strconcat(ctx->info_pool, + p_strconcat(ctx->ctx.info_pool, ctx->ctx.list->ns->prefix, "INBOX", NULL); ctx->listed_prefix_inbox = TRUE; if (imap_match(ctx->ctx.glob, ctx->info.vname) == IMAP_MATCH_YES) diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index c8b0efd0f5..88e085e696 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -48,7 +48,6 @@ mailbox_list_index_iter_init(struct mailbox_list *list, ctx->ctx.flags = flags; ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep); array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5); - ctx->info_pool = pool_alloconly_create("mailbox list index iter info", 128); ctx->ctx.index_iteration = TRUE; /* listing mailboxes from index */ @@ -79,8 +78,6 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx) struct mailbox_list_index_node *node = ctx->next_node; struct mailbox *box; - p_clear(ctx->info_pool); - str_truncate(ctx->path, ctx->parent_len); /* the root directory may have an empty name. in that case we'll still want to insert the separator, so check for non-NULL parent rather @@ -97,7 +94,7 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx) MAILBOX_CHILDREN : MAILBOX_NOCHILDREN; if (strcmp(ctx->info.vname, "INBOX") != 0) { /* non-INBOX */ - ctx->info.vname = p_strdup(ctx->info_pool, ctx->info.vname); + ctx->info.vname = p_strdup(ctx->ctx.info_pool, ctx->info.vname); } else if (!ctx->prefix_inbox_list) { /* listing INBOX itself */ ctx->info.vname = "INBOX"; @@ -108,7 +105,7 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx) } } else { /* listing INBOX/INBOX */ - ctx->info.vname = p_strconcat(ctx->info_pool, + ctx->info.vname = p_strconcat(ctx->ctx.info_pool, ctx->ctx.list->ns->prefix, "INBOX", NULL); ctx->info.flags |= MAILBOX_NONEXISTENT; } @@ -229,7 +226,6 @@ int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx) int ret = ctx->failed ? -1 : 0; pool_unref(&ctx->mailbox_pool); - pool_unref(&ctx->info_pool); pool_unref(&_ctx->pool); return ret; } diff --git a/src/lib-storage/list/mailbox-list-index-sync.c b/src/lib-storage/list/mailbox-list-index-sync.c index 580e39a087..31157e4f68 100644 --- a/src/lib-storage/list/mailbox-list-index-sync.c +++ b/src/lib-storage/list/mailbox-list-index-sync.c @@ -299,6 +299,8 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx) enum mailbox_list_iter_flags iter_flags; const char *patterns[2]; struct mailbox_list_index_node *node; + pool_t info_pool; + int ret; uint32_t seq; bool created; @@ -317,6 +319,8 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx) iter = sync_ctx->ilist->module_ctx.super. iter_init(sync_ctx->list, patterns, iter_flags); + info_pool = pool_alloconly_create("mailbox list iter info", 128); + iter->info_pool = info_pool; sync_ctx->syncing_list = TRUE; while ((info = sync_ctx->ilist->module_ctx.super.iter_next(iter)) != NULL) T_BEGIN { @@ -345,7 +349,9 @@ mailbox_list_index_sync_list(struct mailbox_list_index_sync_context *sync_ctx) } T_END; sync_ctx->syncing_list = FALSE; - if (sync_ctx->ilist->module_ctx.super.iter_deinit(iter) < 0) + ret = sync_ctx->ilist->module_ctx.super.iter_deinit(iter); + pool_unref(&info_pool); + if (ret < 0) return -1; /* successfully listed everything, expunge any unseen mailboxes */ diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 798baf2a75..deeb07cf95 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -143,7 +143,6 @@ struct mailbox_list_index_iterate_context { pool_t mailbox_pool; struct mailbox_info info; - pool_t info_pool; size_t parent_len; string_t *path; diff --git a/src/lib-storage/list/mailbox-list-iter.c b/src/lib-storage/list/mailbox-list-iter.c index eb9e21cfc6..b7a7e0be8b 100644 --- a/src/lib-storage/list/mailbox-list-iter.c +++ b/src/lib-storage/list/mailbox-list-iter.c @@ -157,6 +157,7 @@ mailbox_list_iter_init_multiple(struct mailbox_list *list, } ctx = list->v.iter_init(list, patterns, flags); + ctx->info_pool = pool_alloconly_create("mailbox list iter info", 128); if ((flags & (MAILBOX_LIST_ITER_SELECT_SUBSCRIBED | MAILBOX_LIST_ITER_RETURN_SUBSCRIBED)) != 0) { char sep = mail_namespace_get_sep(list->ns); @@ -847,14 +848,16 @@ mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces, { struct ns_list_iterate_context *ctx; unsigned int i, count; - pool_t pool; + pool_t pool, info_pool; i_assert(namespaces != NULL); pool = pool_alloconly_create("mailbox list namespaces", 1024); + info_pool = pool_alloconly_create("mailbox list iter info", 128); ctx = p_new(pool, struct ns_list_iterate_context, 1); ctx->pool = pool; ctx->type_mask = type_mask; + ctx->ctx.info_pool = info_pool; ctx->ctx.flags = flags; ctx->ctx.list = p_new(pool, struct mailbox_list, 1); ctx->ctx.list->v.iter_next = mailbox_list_ns_iter_next; @@ -1302,6 +1305,9 @@ mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx) if (ctx == &mailbox_list_iter_failed) return NULL; + + p_clear(ctx->info_pool); + do { T_BEGIN { info = mailbox_list_iter_next_call(ctx); @@ -1323,6 +1329,7 @@ int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx) i_free(ctx->specialuse_info_flags); mailbox_tree_iterate_deinit(&ctx->subscriptions_iter); mailbox_tree_deinit(&ctx->subscriptions); + pool_unref(&ctx->info_pool); return ctx->list->v.iter_deinit(ctx); } diff --git a/src/lib-storage/mailbox-list-private.h b/src/lib-storage/mailbox-list-private.h index fe1e94be80..76149946cc 100644 --- a/src/lib-storage/mailbox-list-private.h +++ b/src/lib-storage/mailbox-list-private.h @@ -163,6 +163,9 @@ struct mailbox_list_iterate_context { bool index_iteration; bool iter_from_index_dir; + struct mailbox_info info; + pool_t info_pool; + struct imap_match_glob *glob; struct mailbox_list_autocreate_iterate_context *autocreate_ctx; struct mailbox_info specialuse_info;