]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
LAYOUT=index: Try to rename corrupted mailbox name during mailbox open.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 16 Nov 2016 01:11:30 +0000 (03:11 +0200)
committerGitLab <gitlab@git.dovecot.net>
Wed, 16 Nov 2016 15:08:03 +0000 (17:08 +0200)
src/lib-storage/list/mailbox-list-index-backend.c

index 530a20809956ff44d7fe38d23f7e3af12f8bddeb..d522421ca51ccec3e2f556673a9f1084727c3e22 100644 (file)
@@ -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;
 }