From: Timo Sirainen Date: Wed, 23 Apr 2014 13:31:36 +0000 (+0300) Subject: virtual: Delay initializing search args until the mailbox is actually opened. X-Git-Tag: 2.2.13.rc1~115 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3e1d94509fd76c56f2eb54f98ea02ade9ac2d44a;p=thirdparty%2Fdovecot%2Fcore.git virtual: Delay initializing search args until the mailbox is actually opened. Fixes assert-crash caused by recent changes when virtual mailbox search args contained e.g. keywords. --- diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index 63d78c06b3..ea7bfe19d9 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -178,7 +178,6 @@ static int virtual_backend_box_open(struct virtual_mailbox *mbox, i_array_init(&bbox->uids, 64); i_array_init(&bbox->sync_pending_removes, 64); - mail_search_args_init(bbox->search_args, bbox->box, FALSE, NULL); return 1; } @@ -195,7 +194,6 @@ static int virtual_mailboxes_open(struct virtual_mailbox *mbox, if (ret <= 0) { if (ret < 0) break; - mail_search_args_unref(&bboxes[i]->search_args); array_delete(&mbox->backend_boxes, i, 1); bboxes = array_get(&mbox->backend_boxes, &count); } else { @@ -251,7 +249,8 @@ static void virtual_mailbox_close_internal(struct virtual_mailbox *mbox) if (bboxes[i]->box == NULL) continue; - mail_search_args_deinit(bboxes[i]->search_args); + if (bboxes[i]->search_args != NULL) + mail_search_args_deinit(bboxes[i]->search_args); mailbox_free(&bboxes[i]->box); if (array_is_created(&bboxes[i]->sync_outside_expunges)) array_free(&bboxes[i]->sync_outside_expunges); diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 759b4e2775..0bb738df67 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -96,6 +96,7 @@ struct virtual_backend_box { unsigned int wildcard:1; unsigned int clear_recent:1; unsigned int uids_nonsorted:1; + unsigned int search_args_initialized:1; }; ARRAY_DEFINE_TYPE(virtual_backend_box, struct virtual_backend_box *); diff --git a/src/plugins/virtual/virtual-sync.c b/src/plugins/virtual/virtual-sync.c index 9ed0d9695f..1181819636 100644 --- a/src/plugins/virtual/virtual-sync.c +++ b/src/plugins/virtual/virtual-sync.c @@ -460,6 +460,10 @@ static int virtual_sync_backend_box_init(struct virtual_backend_box *bbox) trans = mailbox_transaction_begin(bbox->box, 0); + if (!bbox->search_args_initialized) { + mail_search_args_init(bbox->search_args, bbox->box, FALSE, NULL); + bbox->search_args_initialized = TRUE; + } search_ctx = mailbox_search_init(trans, bbox->search_args, NULL, 0, NULL); @@ -677,6 +681,10 @@ static int virtual_sync_backend_box_continue(struct virtual_sync_context *ctx, /* initialize the search result from all the existing messages in virtual index. */ + if (!bbox->search_args_initialized) { + mail_search_args_init(bbox->search_args, bbox->box, FALSE, NULL); + bbox->search_args_initialized = TRUE; + } result = mailbox_search_result_alloc(bbox->box, bbox->search_args, result_flags); mailbox_search_result_initial_done(result);