]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Correct escaping for list index lookups
authorSiavash Tavakoli <siavash.tavakoli@open-xchange.com>
Fri, 26 Feb 2021 12:28:03 +0000 (12:28 +0000)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Tue, 16 Mar 2021 15:14:23 +0000 (15:14 +0000)
- 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.

src/lib-storage/list/mailbox-list-index-iter.c
src/lib-storage/list/mailbox-list-index-sync.c
src/lib-storage/list/mailbox-list-index.c
src/lib-storage/list/mailbox-list-index.h

index a8bea53d664f70b27873634d9015fee4f8cf410d..8806651a4a61f7a438c3b604e16cbe280dbaf1af 100644 (file)
@@ -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 ?
index 90318c83c7d4efdfe5e9bef9785afbbf9cd88479..07ca21df4de786977672c48f4648a82c4b0bde22 100644 (file)
@@ -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;
 
index 8069191bc9a1a54412e4d994bbe2deea40faee77..1610f5ef9c4af642471d4e326551fd7ce73921b4 100644 (file)
@@ -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;
index 1fab30e4b326205606f12fbca5583e9618cf8f1e..a3454393128ffa21d9efbea1b046c47886c3d048 100644 (file)
@@ -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,