]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Delay initializing search args until the mailbox is actually opened.
authorTimo Sirainen <tss@iki.fi>
Wed, 23 Apr 2014 13:31:36 +0000 (16:31 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 23 Apr 2014 13:31:36 +0000 (16:31 +0300)
Fixes assert-crash caused by recent changes when virtual mailbox search args
contained e.g. keywords.

src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-storage.h
src/plugins/virtual/virtual-sync.c

index 63d78c06b38e53ab13a0d49dc549257b402fb3de..ea7bfe19d939acde14c1cf74a3f8e36f76273233 100644 (file)
@@ -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);
index 759b4e2775c61573d208b29aed07b4c1c3cf113a..0bb738df671804d8a7d53334bddb7663e21f289e 100644 (file)
@@ -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 *);
 
index 9ed0d9695fc7f955cc9f68faf8abbf650581f51d..118181963600523da5f34ac8590dbba121bf040f 100644 (file)
@@ -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);