From: Timo Sirainen Date: Tue, 15 Nov 2016 23:09:57 +0000 (+0200) Subject: lib-storage: Prevent renaming mailbox under itself. X-Git-Tag: 2.2.27~135 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d76ce1b2f3a9050e1e756f380f77d9accf7e4469;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 492924d053..a00217c796 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;