dovecot-2.0: mdbox: Don't crash when accessing a copied mail tha...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Mar 16 22:29:20 EET 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/b7c66370b0f7
changeset: 10937:b7c66370b0f7
user: Timo Sirainen <tss at iki.fi>
date: Tue Mar 16 22:29:18 2010 +0200
description:
mdbox: Don't crash when accessing a copied mail that hasn't been committed yet.
diffstat:
src/lib-storage/index/dbox-multi/mdbox-mail.c | 1 -
src/lib-storage/index/dbox-multi/mdbox-save.c | 38 +++++++++++++++++++
2 files changed, 38 insertions(+), 1 deletions(-)
diffs (82 lines):
diff -r 6b03aee63752 -r b7c66370b0f7 src/lib-storage/index/dbox-multi/mdbox-mail.c
--- a/src/lib-storage/index/dbox-multi/mdbox-mail.c Tue Mar 16 21:39:47 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c Tue Mar 16 22:29:18 2010 +0200
@@ -125,7 +125,6 @@
mdbox_save_file_get_file(_mail->transaction,
_mail->seq,
&mail->offset);
- mail->open_file->refcount++;
}
if (!dbox_file_is_open(mail->open_file))
diff -r 6b03aee63752 -r b7c66370b0f7 src/lib-storage/index/dbox-multi/mdbox-save.c
--- a/src/lib-storage/index/dbox-multi/mdbox-save.c Tue Mar 16 21:39:47 2010 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-save.c Tue Mar 16 22:29:18 2010 +0200
@@ -41,6 +41,30 @@
ARRAY_DEFINE(mails, struct dbox_save_mail);
};
+static struct dbox_file *
+mdbox_copy_file_get_file(struct mailbox_transaction_context *t,
+ uint32_t seq, uoff_t *offset_r)
+{
+ struct index_transaction_context *it =
+ (struct index_transaction_context *)t;
+ struct mdbox_save_context *ctx =
+ (struct mdbox_save_context *)t->save_ctx;
+ const struct mdbox_mail_index_record *rec;
+ const void *data;
+ bool expunged;
+ uint32_t file_id;
+
+ mail_index_lookup_ext(it->trans_view, seq, ctx->mbox->ext_id,
+ &data, &expunged);
+ rec = data;
+
+ if (dbox_map_lookup(ctx->mbox->storage->map, rec->map_uid,
+ &file_id, offset_r) <= 0)
+ i_unreached();
+
+ return mdbox_file_init(ctx->mbox->storage, file_id);
+}
+
struct dbox_file *
mdbox_save_file_get_file(struct mailbox_transaction_context *t,
uint32_t seq, uoff_t *offset_r)
@@ -57,9 +81,16 @@
mail = &mails[seq - mails[0].seq];
i_assert(mail->seq == seq);
+ if (mail->file_append == NULL) {
+ /* copied mail */
+ return mdbox_copy_file_get_file(t, seq, offset_r);
+ }
+
+ /* saved mail */
if (dbox_file_append_flush(mail->file_append) < 0)
ctx->ctx.failed = TRUE;
+ mail->file_append->file->refcount++;
*offset_r = mail->append_offset;
return mail->file_append->file;
}
@@ -327,6 +358,7 @@
int mdbox_copy(struct mail_save_context *_ctx, struct mail *mail)
{
struct mdbox_save_context *ctx = (struct mdbox_save_context *)_ctx;
+ struct dbox_save_mail *save_mail;
struct mdbox_mailbox *src_mbox;
struct mdbox_mail_index_record rec;
const void *data;
@@ -360,5 +392,11 @@
mail_index_update_ext(ctx->ctx.trans, ctx->ctx.seq,
ctx->mbox->guid_ext_id, data, NULL);
}
+
+ save_mail = array_append_space(&ctx->mails);
+ save_mail->seq = ctx->ctx.seq;
+
+ if (_ctx->dest_mail != NULL)
+ mail_set_seq(_ctx->dest_mail, ctx->ctx.seq);
return 0;
}
More information about the dovecot-cvs
mailing list