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