From 83d0c8152f694ae5b5d1798abda5728dc886102a Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 16 Nov 2016 03:11:30 +0200 Subject: [PATCH] LAYOUT=index: Try to rename corrupted mailbox name during mailbox open. --- .../list/mailbox-list-index-backend.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/lib-storage/list/mailbox-list-index-backend.c b/src/lib-storage/list/mailbox-list-index-backend.c index 530a208099..d522421ca5 100644 --- a/src/lib-storage/list/mailbox-list-index-backend.c +++ b/src/lib-storage/list/mailbox-list-index-backend.c @@ -23,6 +23,10 @@ struct index_mailbox_list { 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 @@ static int index_list_mailbox_open(struct mailbox *box) 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; } -- 2.47.3