From bcfeddf8c91cbb1dcdcf6c54d6d137e08b534ff1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 16 Nov 2016 01:04:18 +0200 Subject: [PATCH] lib-storage: Prevent parent loops in mailbox list index --- src/lib-storage/list/mailbox-list-index.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/lib-storage/list/mailbox-list-index.c b/src/lib-storage/list/mailbox-list-index.c index fcf2cd13f0..bd848668a7 100644 --- a/src/lib-storage/list/mailbox-list-index.c +++ b/src/lib-storage/list/mailbox-list-index.c @@ -254,6 +254,18 @@ mailbox_list_index_node_hash(const struct mailbox_list_index_node *node) POINTER_CAST_TO(node->parent, unsigned int); } +static bool node_has_parent(const struct mailbox_list_index_node *parent, + const struct mailbox_list_index_node *node) +{ + const struct mailbox_list_index_node *n; + + for (n = parent; n != NULL; n = n->parent) { + if (n == node) + return TRUE; + } + return FALSE; +} + static int mailbox_list_index_parse_records(struct mailbox_list_index *ilist, struct mail_index_view *view, const char **error_r) @@ -329,6 +341,14 @@ static int mailbox_list_index_parse_records(struct mailbox_list_index *ilist, break; /* just place it under the root */ node->corrupted_parent = TRUE; + } else if (node_has_parent(parent, node)) { + *error_r = t_strdup_printf( + "parent_uid=%u loops to node itself (%s)", + uid, node->name); + if (ilist->has_backing_store) + break; + /* just place it under the root */ + node->corrupted_parent = TRUE; } else { node->parent = parent; node->next = parent->children; -- 2.47.3