From: Siavash Tavakoli Date: Fri, 26 Feb 2021 12:28:03 +0000 (+0000) Subject: lib-storage: Correct escaping for list index lookups X-Git-Tag: 2.3.15~204 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5dd81d83d8d9120ed2a74d5bd2aa62622885b49c;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Correct escaping for list index lookups - Escape storage name when listing mailbox from index and unescape mailbox name when looking for sibling nodes. - Unescape when adding node to list index. - List index iteration is performed with storage name where separators must be escaped with storage_name_escape_char. Index lookup is done with storage_name which is escaped with storage_name_escape_char but node names are unescaped. --- diff --git a/src/lib-storage/list/mailbox-list-index-iter.c b/src/lib-storage/list/mailbox-list-index-iter.c index a8bea53d66..8806651a4a 100644 --- a/src/lib-storage/list/mailbox-list-index-iter.c +++ b/src/lib-storage/list/mailbox-list-index-iter.c @@ -82,7 +82,12 @@ mailbox_list_index_update_info(struct mailbox_list_index_iterate_context *ctx) str_append_c(ctx->path, mailbox_list_get_hierarchy_sep(ctx->ctx.list)); } - str_append(ctx->path, node->raw_name); + char escape_chars[] = { + ctx->ctx.list->set.storage_name_escape_char, + mailbox_list_get_hierarchy_sep(ctx->ctx.list), + '\0' + }; + mailbox_list_name_escape(node->raw_name, escape_chars, ctx->path); ctx->info.vname = mailbox_list_get_vname(ctx->ctx.list, str_c(ctx->path)); ctx->info.flags = node->children != NULL ? diff --git a/src/lib-storage/list/mailbox-list-index-sync.c b/src/lib-storage/list/mailbox-list-index-sync.c index 90318c83c7..07ca21df4d 100644 --- a/src/lib-storage/list/mailbox-list-index-sync.c +++ b/src/lib-storage/list/mailbox-list-index-sync.c @@ -61,6 +61,7 @@ mailbox_list_index_node_add(struct mailbox_list_index_sync_context *ctx, { struct mailbox_list_index_node *node; char *dup_name; + mailbox_list_name_unescape(&name, ctx->list->set.storage_name_escape_char); node = p_new(ctx->ilist->mailbox_pool, struct mailbox_list_index_node, 1); @@ -104,7 +105,7 @@ uint32_t mailbox_list_index_sync_name(struct mailbox_list_index_sync_context *ct /* find the last node that exists in the path */ node = ctx->ilist->mailbox_tree; parent = NULL; for (i = 0; path[i] != NULL; i++) { - node = mailbox_list_index_node_find_sibling(node, path[i]); + node = mailbox_list_index_node_find_sibling(ctx->list, node, path[i]); if (node == NULL) break; diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index 8069191bc9..1610f5ef9c 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -114,9 +114,12 @@ int mailbox_list_index_index_open(struct mailbox_list *list) } struct mailbox_list_index_node * -mailbox_list_index_node_find_sibling(struct mailbox_list_index_node *node, +mailbox_list_index_node_find_sibling(const struct mailbox_list *list, + struct mailbox_list_index_node *node, const char *name) { + mailbox_list_name_unescape(&name, list->set.storage_name_escape_char); + while (node != NULL) { if (strcmp(node->raw_name, name) == 0) return node; @@ -135,12 +138,12 @@ mailbox_list_index_lookup_real(struct mailbox_list *list, const char *name) char sep[2]; if (*name == '\0') - return mailbox_list_index_node_find_sibling(node, ""); + return mailbox_list_index_node_find_sibling(list, node, ""); sep[0] = mailbox_list_get_hierarchy_sep(list); sep[1] = '\0'; path = t_strsplit(name, sep); for (i = 0;; i++) { - node = mailbox_list_index_node_find_sibling(node, path[i]); + node = mailbox_list_index_node_find_sibling(list, node, path[i]); if (node == NULL || path[i+1] == NULL) break; node = node->children; diff --git a/src/lib-storage/list/mailbox-list-index.h b/src/lib-storage/list/mailbox-list-index.h index 1fab30e4b3..a345439312 100644 --- a/src/lib-storage/list/mailbox-list-index.h +++ b/src/lib-storage/list/mailbox-list-index.h @@ -187,7 +187,8 @@ int mailbox_list_index_view_open(struct mailbox *box, bool require_refreshed, uint32_t *seq_r); struct mailbox_list_index_node * -mailbox_list_index_node_find_sibling(struct mailbox_list_index_node *node, +mailbox_list_index_node_find_sibling(const struct mailbox_list *list, + struct mailbox_list_index_node *node, const char *name); void mailbox_list_index_reset(struct mailbox_list_index *ilist); int mailbox_list_index_parse(struct mailbox_list *list,