dovecot-2.0: virtual: Don't crash when trying to reopen a closed...

dovecot at dovecot.org dovecot at dovecot.org
Thu Apr 8 02:46:14 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/09ecf24a798b
changeset: 11111:09ecf24a798b
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Apr 08 02:45:23 2010 +0300
description:
virtual: Don't crash when trying to reopen a closed mailbox.

diffstat:

 src/plugins/virtual/virtual-config.c  |   1 +
 src/plugins/virtual/virtual-storage.c |  77 ++++++++++++++++++++++++--------------
 2 files changed, 49 insertions(+), 29 deletions(-)

diffs (121 lines):

diff -r af7beceda361 -r 09ecf24a798b src/plugins/virtual/virtual-config.c
--- a/src/plugins/virtual/virtual-config.c	Wed Apr 07 14:47:40 2010 +0300
+++ b/src/plugins/virtual/virtual-config.c	Thu Apr 08 02:45:23 2010 +0300
@@ -394,4 +394,5 @@
 		if (bboxes[i]->search_args != NULL)
 			mail_search_args_unref(&bboxes[i]->search_args);
 	}
+	array_free(&mbox->backend_boxes);
 }
diff -r af7beceda361 -r 09ecf24a798b src/plugins/virtual/virtual-storage.c
--- a/src/plugins/virtual/virtual-storage.c	Wed Apr 07 14:47:40 2010 +0300
+++ b/src/plugins/virtual/virtual-storage.c	Thu Apr 08 02:45:23 2010 +0300
@@ -237,11 +237,34 @@
 	return &mbox->box;
 }
 
+static void virtual_mailbox_close_internal(struct virtual_mailbox *mbox)
+{
+	struct virtual_backend_box **bboxes;
+	unsigned int i, count;
+
+	bboxes = array_get_modifiable(&mbox->backend_boxes, &count);
+	for (i = 0; i < count; i++) {
+		if (bboxes[i]->search_result != NULL)
+			mailbox_search_result_free(&bboxes[i]->search_result);
+
+		if (bboxes[i]->box == NULL)
+			continue;
+
+		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);
+		array_free(&bboxes[i]->sync_pending_removes);
+		array_free(&bboxes[i]->uids);
+	}
+	i_free_and_null(mbox->vseq_lookup_prev_mailbox);
+}
+
 static int virtual_mailbox_open(struct mailbox *box)
 {
 	struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
 	struct stat st;
-	bool failed;
+	int ret = 0;
 
 	if (virtual_mailbox_is_in_open_stack(mbox->storage, box->name)) {
 		mail_storage_set_critical(box->storage,
@@ -265,40 +288,36 @@
 		return -1;
 	}
 
-	array_append(&mbox->storage->open_stack, &box->name, 1);
-	failed = virtual_config_read(mbox) < 0 ||
-		virtual_mailboxes_open(mbox, box->flags) < 0;
-	array_delete(&mbox->storage->open_stack,
-		     array_count(&mbox->storage->open_stack)-1, 1);
-	return failed ? -1 : index_storage_mailbox_open(box, FALSE);
+	if (!array_is_created(&mbox->backend_boxes))
+		ret = virtual_config_read(mbox);
+	if (ret == 0) {
+		array_append(&mbox->storage->open_stack, &box->name, 1);
+		ret = virtual_mailboxes_open(mbox, box->flags);
+		array_delete(&mbox->storage->open_stack,
+			     array_count(&mbox->storage->open_stack)-1, 1);
+	}
+
+	if (ret < 0) {
+		virtual_mailbox_close_internal(mbox);
+		return -1;
+	}
+	return index_storage_mailbox_open(box, FALSE);
 }
 
 static void virtual_mailbox_close(struct mailbox *box)
 {
 	struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
-	struct virtual_backend_box **bboxes;
-	unsigned int i, count;
+
+	virtual_mailbox_close_internal(mbox);
+	index_storage_mailbox_close(box);
+}
+
+static void virtual_mailbox_free(struct mailbox *box)
+{
+	struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
 
 	virtual_config_free(mbox);
-
-	bboxes = array_get_modifiable(&mbox->backend_boxes, &count);
-	for (i = 0; i < count; i++) {
-		if (bboxes[i]->search_result != NULL)
-			mailbox_search_result_free(&bboxes[i]->search_result);
-
-		if (bboxes[i]->box == NULL)
-			continue;
-
-		mailbox_free(&bboxes[i]->box);
-		if (array_is_created(&bboxes[i]->sync_outside_expunges))
-			array_free(&bboxes[i]->sync_outside_expunges);
-		array_free(&bboxes[i]->sync_pending_removes);
-		array_free(&bboxes[i]->uids);
-	}
-	array_free(&mbox->backend_boxes);
-	i_free(mbox->vseq_lookup_prev_mailbox);
-
-	index_storage_mailbox_close(box);
+	index_storage_mailbox_free(box);
 }
 
 static int
@@ -476,7 +495,7 @@
 		index_storage_mailbox_enable,
 		virtual_mailbox_open,
 		virtual_mailbox_close,
-		index_storage_mailbox_free,
+		virtual_mailbox_free,
 		virtual_mailbox_create,
 		virtual_mailbox_update,
 		index_storage_mailbox_delete,


More information about the dovecot-cvs mailing list