Mercurial > dovecot > core-2.2
changeset 18534:94bd895721d8
mbox: Fixed crash/corruption in some situations when the first mail was expunged.
This could be reproduced with default mbox settings, IMAP session that does
- STORE 1 +FLAGS \DELETED
- EXPUNGE
With mbox containing:
===
From root@example.com Tue Jan 13 10:18:16 2015
a
From root@example.com Tue Jan 13 10:18:20 2015
a
===
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 07 May 2015 00:01:08 +0300 |
parents | 18b71db74d31 |
children | 34b5abf6b9b7 |
files | src/lib-storage/index/mbox/mbox-sync.c |
diffstat | 1 files changed, 9 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/mbox/mbox-sync.c Wed May 06 19:50:23 2015 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync.c Thu May 07 00:01:08 2015 +0300 @@ -640,7 +640,7 @@ static int mbox_sync_handle_header(struct mbox_sync_mail_context *mail_ctx) { struct mbox_sync_context *sync_ctx = mail_ctx->sync_ctx; - uoff_t orig_from_offset; + uoff_t orig_from_offset, postlf_from_offset = (uoff_t)-1; off_t move_diff; int ret; @@ -657,6 +657,7 @@ if (sync_ctx->first_mail_crlf_expunged) mail_ctx->mail.from_offset++; } + postlf_from_offset = mail_ctx->mail.from_offset; /* read the From-line before rewriting overwrites it */ if (mbox_read_from_line(mail_ctx) < 0) @@ -710,10 +711,16 @@ /* create dummy message to describe the expunged data */ struct mbox_sync_mail mail; + /* if this is going to be the first mail, increase the + from_offset to point to the beginning of the + From-line, because the previous [CR]LF is already + covered by expunged_space. */ + i_assert(postlf_from_offset != (uoff_t)-1); + mail_ctx->mail.from_offset = postlf_from_offset; + memset(&mail, 0, sizeof(mail)); mail.expunged = TRUE; mail.offset = mail.from_offset = - (sync_ctx->dest_first_mail ? 1 : 0) + mail_ctx->mail.from_offset - sync_ctx->expunged_space; mail.space = sync_ctx->expunged_space;