dovecot: Free mail before committing index sync to avoid crashes...

dovecot at dovecot.org dovecot at dovecot.org
Sat Dec 29 07:22:42 EET 2007


details:   http://hg.dovecot.org/dovecot/rev/72122918288c
changeset: 7060:72122918288c
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Dec 29 07:22:38 2007 +0200
description:
Free mail before committing index sync to avoid crashes when updating cache
file.

diffstat:

1 file changed, 8 insertions(+), 3 deletions(-)
src/lib-storage/index/maildir/maildir-save.c |   11 ++++++++---

diffs (30 lines):

diff -r 0a0ff276bc38 -r 72122918288c src/lib-storage/index/maildir/maildir-save.c
--- a/src/lib-storage/index/maildir/maildir-save.c	Sat Dec 29 07:18:44 2007 +0200
+++ b/src/lib-storage/index/maildir/maildir-save.c	Sat Dec 29 07:22:38 2007 +0200
@@ -693,8 +693,16 @@ int maildir_transaction_save_commit_pre(
 	*t->ictx.saved_uid_validity =
 		maildir_uidlist_get_uid_validity(ctx->mbox->uidlist);
 
+	if (ctx->mail != NULL) {
+		/* Mail freeing may trigger cache updates and a call to
+		   maildir_save_file_get_path(). Do this before finishing index
+		   sync so we still have keywords_sync_ctx. */
+		mail_free(&ctx->mail);
+	}
+
 	if (sync_commit) {
 		/* It doesn't matter if index syncing fails */
+		ctx->keywords_sync_ctx = NULL;
 		(void)maildir_sync_index_finish(&ctx->sync_ctx,
 						ret < 0, !sync_commit);
 	}
@@ -715,9 +723,6 @@ int maildir_transaction_save_commit_pre(
 		maildir_transaction_save_rollback(ctx);
 		return -1;
 	}
-
-	if (ctx->mail != NULL)
-		mail_free(&ctx->mail);
 	return ret;
 }
 


More information about the dovecot-cvs mailing list