Mercurial > dovecot > core-2.2
changeset 13120:06873db0bfef
lib-storage: mail->saving was set too late, which could have caused crashes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 28 Jul 2011 17:01:09 +0300 |
parents | 222cc828c31f |
children | 15082db3225a |
files | src/lib-storage/index/cydir/cydir-save.c src/lib-storage/index/dbox-common/dbox-save.c src/lib-storage/index/dbox-multi/mdbox-save.c src/lib-storage/index/dbox-single/sdbox-copy.c src/lib-storage/index/imapc/imapc-mail.c src/lib-storage/index/index-mail.c src/lib-storage/index/index-mail.h src/lib-storage/index/maildir/maildir-save.c src/lib-storage/index/mbox/mbox-mail.c src/lib-storage/index/mbox/mbox-save.c src/lib-storage/mail-storage-private.h src/lib-storage/mail.c src/plugins/virtual/virtual-mail.c |
diffstat | 13 files changed, 30 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/cydir/cydir-save.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/cydir/cydir-save.c Thu Jul 28 17:01:09 2011 +0300 @@ -121,8 +121,7 @@ ctx->mail = mail_alloc(trans, 0, NULL); _ctx->dest_mail = ctx->mail; } - mail_set_seq(_ctx->dest_mail, ctx->seq); - _ctx->dest_mail->saving = TRUE; + mail_set_seq_saving(_ctx->dest_mail, ctx->seq); crlf_input = i_stream_create_crlf(input); ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input);
--- a/src/lib-storage/index/dbox-common/dbox-save.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/dbox-common/dbox-save.c Thu Jul 28 17:01:09 2011 +0300 @@ -44,8 +44,7 @@ ctx->mail = mail_alloc(_ctx->transaction, 0, NULL); _ctx->dest_mail = ctx->mail; } - mail_set_seq(_ctx->dest_mail, ctx->seq); - _ctx->dest_mail->saving = TRUE; + mail_set_seq_saving(_ctx->dest_mail, ctx->seq); crlf_input = i_stream_create_lf(input); ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input);
--- a/src/lib-storage/index/dbox-multi/mdbox-save.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/dbox-multi/mdbox-save.c Thu Jul 28 17:01:09 2011 +0300 @@ -442,9 +442,7 @@ 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); - _ctx->dest_mail->saving = TRUE; - } + if (_ctx->dest_mail != NULL) + mail_set_seq_saving(_ctx->dest_mail, ctx->ctx.seq); return 0; }
--- a/src/lib-storage/index/dbox-single/sdbox-copy.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/dbox-single/sdbox-copy.c Thu Jul 28 17:01:09 2011 +0300 @@ -130,10 +130,8 @@ index_copy_cache_fields(_ctx, mail, ctx->seq); sdbox_save_add_file(_ctx, dest_file); - if (_ctx->dest_mail != NULL) { - mail_set_seq(_ctx->dest_mail, ctx->seq); - _ctx->dest_mail->saving = TRUE; - } + if (_ctx->dest_mail != NULL) + mail_set_seq_saving(_ctx->dest_mail, ctx->seq); dbox_file_unref(&src_file); return 1; }
--- a/src/lib-storage/index/imapc/imapc-mail.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/imapc/imapc-mail.c Thu Jul 28 17:01:09 2011 +0300 @@ -165,7 +165,7 @@ return TRUE; } -static void imapc_mail_set_seq(struct mail *_mail, uint32_t seq) +static void imapc_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving) { struct imapc_mail *imail = (struct imapc_mail *)_mail; struct index_mail *mail = &imail->imail; @@ -173,7 +173,7 @@ time_t date; uoff_t size; - index_mail_set_seq(_mail, seq); + index_mail_set_seq(_mail, seq, saving); if ((mail->wanted_fields & MAIL_FETCH_RECEIVED_DATE) != 0) (void)index_mail_get_received_date(_mail, &date);
--- a/src/lib-storage/index/index-mail.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/index-mail.c Thu Jul 28 17:01:09 2011 +0300 @@ -1207,7 +1207,7 @@ mail->data.save_envelope = TRUE; } -void index_mail_set_seq(struct mail *_mail, uint32_t seq) +void index_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving) { struct index_mail *mail = (struct index_mail *)_mail; struct index_mail_data *data = &mail->data; @@ -1224,6 +1224,7 @@ data->seq = seq; mail->mail.mail.seq = seq; + mail->mail.mail.saving = saving; mail_index_lookup_uid(_mail->transaction->view, seq, &mail->mail.mail.uid); @@ -1385,7 +1386,7 @@ uint32_t seq; if (mail_index_lookup_seq(_mail->box->view, uid, &seq)) { - index_mail_set_seq(_mail, seq); + index_mail_set_seq(_mail, seq, FALSE); return TRUE; } else { index_mail_reset(mail);
--- a/src/lib-storage/index/index-mail.h Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/index-mail.h Thu Jul 28 17:01:09 2011 +0300 @@ -156,7 +156,7 @@ enum mail_fetch_field wanted_fields, struct mailbox_header_lookup_ctx *_wanted_headers); -void index_mail_set_seq(struct mail *mail, uint32_t seq); +void index_mail_set_seq(struct mail *mail, uint32_t seq, bool saving); bool index_mail_set_uid(struct mail *mail, uint32_t uid); void index_mail_set_uid_cache_updates(struct mail *mail, bool set); bool index_mail_prefetch(struct mail *mail);
--- a/src/lib-storage/index/maildir/maildir-save.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/maildir/maildir-save.c Thu Jul 28 17:01:09 2011 +0300 @@ -211,8 +211,7 @@ ctx->mail = mail_alloc(_ctx->transaction, 0, NULL); _ctx->dest_mail = ctx->mail; } - mail_set_seq(_ctx->dest_mail, ctx->seq); - _ctx->dest_mail->saving = TRUE; + mail_set_seq_saving(_ctx->dest_mail, ctx->seq); if (ctx->input == NULL) { /* copying with hardlinking. */
--- a/src/lib-storage/index/mbox/mbox-mail.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/mbox/mbox-mail.c Thu Jul 28 17:01:09 2011 +0300 @@ -365,11 +365,11 @@ return index_mail_init_stream(mail, hdr_size, body_size, stream_r); } -static void mbox_mail_set_seq(struct mail *_mail, uint32_t seq) +static void mbox_mail_set_seq(struct mail *_mail, uint32_t seq, bool saving) { struct index_mail *mail = (struct index_mail *)_mail; - index_mail_set_seq(_mail, seq); + index_mail_set_seq(_mail, seq, saving); mail->data.dont_cache_fetch_fields |= MAIL_FETCH_PHYSICAL_SIZE; }
--- a/src/lib-storage/index/mbox/mbox-save.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/index/mbox/mbox-save.c Thu Jul 28 17:01:09 2011 +0300 @@ -502,8 +502,7 @@ } _ctx->dest_mail = ctx->mail; } - mail_set_seq(_ctx->dest_mail, ctx->seq); - _ctx->dest_mail->saving = TRUE; + mail_set_seq_saving(_ctx->dest_mail, ctx->seq); } mbox_save_append_flag_headers(ctx->headers, save_flags); mbox_save_append_keyword_headers(ctx, _ctx->keywords);
--- a/src/lib-storage/mail-storage-private.h Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/mail-storage-private.h Thu Jul 28 17:01:09 2011 +0300 @@ -274,7 +274,7 @@ struct mail_vfuncs { void (*close)(struct mail *mail); void (*free)(struct mail *mail); - void (*set_seq)(struct mail *mail, uint32_t seq); + void (*set_seq)(struct mail *mail, uint32_t seq, bool saving); bool (*set_uid)(struct mail *mail, uint32_t uid); void (*set_uid_cache_updates)(struct mail *mail, bool set); bool (*prefetch)(struct mail *mail); @@ -485,6 +485,7 @@ bool mail_prefetch(struct mail *mail); int mail_set_aborted(struct mail *mail); void mail_set_expunged(struct mail *mail); +void mail_set_seq_saving(struct mail *mail, uint32_t seq); void mailbox_set_deleted(struct mailbox *box); int mailbox_mark_index_deleted(struct mailbox *box, bool del); /* Easy wrapper for getting mailbox's MAILBOX_LIST_PATH_TYPE_MAILBOX */
--- a/src/lib-storage/mail.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/lib-storage/mail.c Thu Jul 28 17:01:09 2011 +0300 @@ -38,7 +38,14 @@ { struct mail_private *p = (struct mail_private *)mail; - p->v.set_seq(mail, seq); + p->v.set_seq(mail, seq, FALSE); +} + +void mail_set_seq_saving(struct mail *mail, uint32_t seq) +{ + struct mail_private *p = (struct mail_private *)mail; + + p->v.set_seq(mail, seq, TRUE); } bool mail_set_uid(struct mail *mail, uint32_t uid)
--- a/src/plugins/virtual/virtual-mail.c Thu Jul 28 17:00:29 2011 +0300 +++ b/src/plugins/virtual/virtual-mail.c Thu Jul 28 17:01:09 2011 +0300 @@ -106,7 +106,7 @@ return vmail->backend_mail; } -static void virtual_mail_set_seq(struct mail *mail, uint32_t seq) +static void virtual_mail_set_seq(struct mail *mail, uint32_t seq, bool saving) { struct virtual_mail *vmail = (struct virtual_mail *)mail; struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box; @@ -115,6 +115,8 @@ const void *data; bool expunged; + i_assert(!saving); + mail_index_lookup_ext(mail->box->view, seq, mbox->virtual_ext_id, &data, &expunged); vrec = data; @@ -149,7 +151,7 @@ if (!mail_index_lookup_seq(mail->box->view, uid, &seq)) return FALSE; - virtual_mail_set_seq(mail, seq); + virtual_mail_set_seq(mail, seq, FALSE); return TRUE; }