From 606e388022ed2c9e94f912a5205626d11a9da6dc Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 16 Nov 2016 01:09:57 +0200 Subject: [PATCH] lib-storage: Prevent renaming mailbox under itself. This resulted earlier in a loop, which broke the mailbox index. Note that IMAP already prevented this, so it could only be triggered by other tools, like doveadm. --- src/lib-storage/list/mailbox-list-index-backend.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 5adfb21477..2b46275d43 100644 --- a/src/lib-storage/list/mailbox-list-index-backend.c +++ b/src/lib-storage/list/mailbox-list-index-backend.c @@ -582,6 +582,7 @@ index_list_rename_mailbox(struct mailbox_list *_oldlist, const char *oldname, struct mailbox_list *_newlist, const char *newname) { struct index_mailbox_list *list = (struct index_mailbox_list *)_oldlist; + const unsigned int oldname_len = strlen(oldname); struct mailbox_list_index_sync_context *sync_ctx; struct mailbox_list_index_record oldrec, newrec; struct mailbox_list_index_node *oldnode, *newnode, *child; @@ -595,6 +596,13 @@ index_list_rename_mailbox(struct mailbox_list *_oldlist, const char *oldname, return -1; } + if (strncmp(oldname, newname, oldname_len) == 0 && + newname[oldname_len] == mailbox_list_get_hierarchy_sep(_newlist)) { + mailbox_list_set_error(_oldlist, MAIL_ERROR_NOTPOSSIBLE, + "Can't rename mailbox under itself."); + return -1; + } + if (mailbox_list_index_sync_begin(&list->list, &sync_ctx) < 0) return -1;