return -1;
seq = mailbox_list_index_sync_name(sync_ctx, box->name, &node, &created);
+ if (box->corrupted_mailbox_name) {
+ /* an existing mailbox is being created with a "unknown" name.
+ opening the mailbox will hopefully find its real name and
+ rename it. */
+ node->flags |= MAILBOX_LIST_INDEX_FLAG_CORRUPTED_NAME;
+ mail_index_update_flags(sync_ctx->trans, seq, MODIFY_ADD,
+ MAILBOX_LIST_INDEX_FLAG_CORRUPTED_NAME);
+ }
if (!created &&
(node->flags & (MAILBOX_LIST_INDEX_FLAG_NONEXISTENT |
MAILBOX_LIST_INDEX_FLAG_NOSELECT)) == 0) {
/* already selectable */
- (void)mailbox_list_index_sync_end(&sync_ctx, FALSE);
+ (void)mailbox_list_index_sync_end(&sync_ctx, TRUE);
return 0;
}
i_assert(guid_128_is_empty(rec.guid));
/* make it selectable */
- node->flags = 0;
- mail_index_update_flags(sync_ctx->trans, seq, MODIFY_REPLACE, 0);
+ node->flags &= ~(MAILBOX_LIST_INDEX_FLAG_NONEXISTENT |
+ MAILBOX_LIST_INDEX_FLAG_NOSELECT |
+ MAILBOX_LIST_INDEX_FLAG_NOINFERIORS);
+ mail_index_update_flags(sync_ctx->trans, seq, MODIFY_REPLACE, node->flags);
memcpy(rec.guid, mailbox_guid, sizeof(rec.guid));
mail_index_update_ext(sync_ctx->trans, seq, ilist->ext_id, &rec, NULL);
{
struct mailbox_list_index_node *node;
+ if (box->corrupted_mailbox_name)
+ return TRUE;
+
node = mailbox_list_index_lookup(box->list, box->name);
return node != NULL &&
(node->flags & MAILBOX_LIST_INDEX_FLAG_CORRUPTED_NAME) != 0;
unsigned int skip_create_name_restrictions:1;
/* v2.2.x API kludge: quick-parameter to list_index_has_changed() */
unsigned int list_index_has_changed_quick:1;
+ /* Using LAYOUT=index and mailbox is being opened with a corrupted
+ mailbox name. Try to revert to the previously known good name. */
+ unsigned int corrupted_mailbox_name:1;
};
struct mail_vfuncs {