dovecot-2.2: virtual: Delay initializing search args until the m...

dovecot at dovecot.org dovecot at dovecot.org
Wed Apr 23 13:32:04 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/0aa159d6ef30
changeset: 17248:0aa159d6ef30
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Apr 23 16:31:36 2014 +0300
description:
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.

diffstat:

 src/plugins/virtual/virtual-storage.c |  5 ++---
 src/plugins/virtual/virtual-storage.h |  1 +
 src/plugins/virtual/virtual-sync.c    |  8 ++++++++
 3 files changed, 11 insertions(+), 3 deletions(-)

diffs (65 lines):

diff -r 09c114091c88 -r 0aa159d6ef30 src/plugins/virtual/virtual-storage.c
--- a/src/plugins/virtual/virtual-storage.c	Tue Apr 22 13:15:21 2014 +0300
+++ b/src/plugins/virtual/virtual-storage.c	Wed Apr 23 16:31:36 2014 +0300
@@ -178,7 +178,6 @@
 
 	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 @@
 		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 @@
 		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 -r 09c114091c88 -r 0aa159d6ef30 src/plugins/virtual/virtual-storage.h
--- a/src/plugins/virtual/virtual-storage.h	Tue Apr 22 13:15:21 2014 +0300
+++ b/src/plugins/virtual/virtual-storage.h	Wed Apr 23 16:31:36 2014 +0300
@@ -96,6 +96,7 @@
 	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 -r 09c114091c88 -r 0aa159d6ef30 src/plugins/virtual/virtual-sync.c
--- a/src/plugins/virtual/virtual-sync.c	Tue Apr 22 13:15:21 2014 +0300
+++ b/src/plugins/virtual/virtual-sync.c	Wed Apr 23 16:31:36 2014 +0300
@@ -460,6 +460,10 @@
 
 	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 @@
 
 	/* 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);


More information about the dovecot-cvs mailing list