Mercurial > dovecot > core-2.2
changeset 21139:16b61be2631f
LAYOUT=index: Try to rename corrupted mailbox name during mailbox open.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Wed, 16 Nov 2016 03:11:30 +0200 |
parents | b24657e6abe7 |
children | 977d0025e4b3 |
files | src/lib-storage/list/mailbox-list-index-backend.c |
diffstat | 1 files changed, 16 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/list/mailbox-list-index-backend.c Wed Nov 16 03:10:10 2016 +0200 +++ b/src/lib-storage/list/mailbox-list-index-backend.c Wed Nov 16 03:11:30 2016 +0200 @@ -23,6 +23,10 @@ extern struct mailbox_list index_mailbox_list; +static int +index_list_rename_mailbox(struct mailbox_list *_oldlist, const char *oldname, + struct mailbox_list *_newlist, const char *newname); + static struct mailbox_list *index_list_alloc(void) { struct index_mailbox_list *list; @@ -522,6 +526,18 @@ mail_index_update_header_ext(trans, box->box_name_hdr_ext_id, 0, box_zerosep_name, box_name_len); (void)mail_index_transaction_commit(&trans); + } else if (name_hdr_size > 0) { + /* Mailbox name is corrupted. Rename it to the previous name. */ + char sep = mailbox_list_get_hierarchy_sep(box->list); + char *newname = t_malloc0(name_hdr_size + 1); + memcpy(newname, name_hdr, name_hdr_size); + for (size_t i = 0; i < name_hdr_size; i++) { + if (newname[i] == '\0') + newname[i] = sep; + } + + (void)index_list_rename_mailbox(box->list, box->name, + box->list, newname); } return 0; }