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;
 }