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;
 }