From fc40a9a002458e372ff4b9f6f4e15239520c0bcd Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 4 Jun 2010 19:16:42 +0100 Subject: [PATCH] lib-storage: Fixed accessing uncommitted saved mails with dsync dsync preserves uids, so uid==0 check won't work for detecting such mails. --HG-- branch : HEAD --- src/lib-storage/index/cydir/cydir-save.c | 1 + src/lib-storage/index/dbox-common/dbox-save.c | 1 + src/lib-storage/index/dbox-multi/mdbox-mail.c | 2 +- src/lib-storage/index/dbox-multi/mdbox-save.c | 4 +++- src/lib-storage/index/dbox-single/sdbox-copy.c | 4 +++- src/lib-storage/index/dbox-single/sdbox-mail.c | 2 +- src/lib-storage/index/index-mail.c | 1 + src/lib-storage/index/maildir/maildir-mail.c | 2 +- src/lib-storage/index/maildir/maildir-save.c | 1 + src/lib-storage/index/mbox/mbox-save.c | 1 + src/lib-storage/mail-storage.h | 1 + 11 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/lib-storage/index/cydir/cydir-save.c b/src/lib-storage/index/cydir/cydir-save.c index 40444c6475..a86b3b7c36 100644 --- a/src/lib-storage/index/cydir/cydir-save.c +++ b/src/lib-storage/index/cydir/cydir-save.c @@ -121,6 +121,7 @@ int cydir_save_begin(struct mail_save_context *_ctx, struct istream *input) _ctx->dest_mail = ctx->mail; } mail_set_seq(_ctx->dest_mail, ctx->seq); + _ctx->dest_mail->saving = TRUE; crlf_input = i_stream_create_crlf(input); ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input); diff --git a/src/lib-storage/index/dbox-common/dbox-save.c b/src/lib-storage/index/dbox-common/dbox-save.c index da86e7da49..657fe12d70 100644 --- a/src/lib-storage/index/dbox-common/dbox-save.c +++ b/src/lib-storage/index/dbox-common/dbox-save.c @@ -42,6 +42,7 @@ void dbox_save_begin(struct dbox_save_context *ctx, struct istream *input) _ctx->dest_mail = ctx->mail; } mail_set_seq(_ctx->dest_mail, ctx->seq); + _ctx->dest_mail->saving = TRUE; crlf_input = i_stream_create_lf(input); ctx->input = index_mail_cache_parse_init(_ctx->dest_mail, crlf_input); diff --git a/src/lib-storage/index/dbox-multi/mdbox-mail.c b/src/lib-storage/index/dbox-multi/mdbox-mail.c index 4899803438..0f20708ea4 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-mail.c +++ b/src/lib-storage/index/dbox-multi/mdbox-mail.c @@ -113,7 +113,7 @@ int mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r, do { if (mail->open_file != NULL) { /* already open */ - } else if (_mail->uid != 0) { + } else if (!_mail->saving) { if (mdbox_mail_lookup(mbox, _mail->transaction->view, _mail->seq, &map_uid) < 0) return -1; diff --git a/src/lib-storage/index/dbox-multi/mdbox-save.c b/src/lib-storage/index/dbox-multi/mdbox-save.c index d934940226..fa354602a7 100644 --- a/src/lib-storage/index/dbox-multi/mdbox-save.c +++ b/src/lib-storage/index/dbox-multi/mdbox-save.c @@ -393,7 +393,9 @@ int mdbox_copy(struct mail_save_context *_ctx, struct mail *mail) save_mail = array_append_space(&ctx->mails); save_mail->seq = ctx->ctx.seq; - if (_ctx->dest_mail != NULL) + if (_ctx->dest_mail != NULL) { mail_set_seq(_ctx->dest_mail, ctx->ctx.seq); + _ctx->dest_mail->saving = TRUE; + } return 0; } diff --git a/src/lib-storage/index/dbox-single/sdbox-copy.c b/src/lib-storage/index/dbox-single/sdbox-copy.c index 8b9f6b8072..5e122dd9ee 100644 --- a/src/lib-storage/index/dbox-single/sdbox-copy.c +++ b/src/lib-storage/index/dbox-single/sdbox-copy.c @@ -51,8 +51,10 @@ sdbox_copy_hardlink(struct mail_save_context *_ctx, struct mail *mail) dbox_save_add_to_index(ctx); sdbox_save_add_file(_ctx, dest_file); - if (_ctx->dest_mail != NULL) + if (_ctx->dest_mail != NULL) { mail_set_seq(_ctx->dest_mail, ctx->seq); + _ctx->dest_mail->saving = TRUE; + } return 1; } diff --git a/src/lib-storage/index/dbox-single/sdbox-mail.c b/src/lib-storage/index/dbox-single/sdbox-mail.c index 4212483ffa..d74e409648 100644 --- a/src/lib-storage/index/dbox-single/sdbox-mail.c +++ b/src/lib-storage/index/dbox-single/sdbox-mail.c @@ -32,7 +32,7 @@ static bool sdbox_mail_file_set(struct dbox_mail *mail) if (mail->open_file != NULL) { /* already set */ return FALSE; - } else if (_mail->uid != 0) { + } else if (!_mail->saving) { mail->open_file = sdbox_file_init(mbox, _mail->uid); return FALSE; } else { diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index d4a74c6fd2..e33b1bc081 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -1172,6 +1172,7 @@ static void index_mail_reset(struct index_mail *mail) mail->mail.mail.expunged = FALSE; mail->mail.mail.has_nuls = FALSE; mail->mail.mail.has_no_nuls = FALSE; + mail->mail.mail.saving = FALSE; } static void check_envelope(struct index_mail *mail) diff --git a/src/lib-storage/index/maildir/maildir-mail.c b/src/lib-storage/index/maildir/maildir-mail.c index 5f780c171c..97098e9d2e 100644 --- a/src/lib-storage/index/maildir/maildir-mail.c +++ b/src/lib-storage/index/maildir/maildir-mail.c @@ -73,7 +73,7 @@ maildir_open_mail(struct maildir_mailbox *mbox, struct mail *mail, ctx.path = NULL; p->stats_open_lookup_count++; - if (mail->uid != 0) { + if (!mail->saving) { if (maildir_file_do(mbox, mail->uid, do_open, &ctx) < 0) return NULL; } else { diff --git a/src/lib-storage/index/maildir/maildir-save.c b/src/lib-storage/index/maildir/maildir-save.c index c42c248efd..163e5f7681 100644 --- a/src/lib-storage/index/maildir/maildir-save.c +++ b/src/lib-storage/index/maildir/maildir-save.c @@ -209,6 +209,7 @@ void maildir_save_add(struct mail_save_context *_ctx, const char *base_fname, _ctx->dest_mail = ctx->mail; } mail_set_seq(_ctx->dest_mail, ctx->seq); + _ctx->dest_mail->saving = TRUE; if (ctx->input == NULL) { /* FIXME: copying with hardlinking. we could copy the diff --git a/src/lib-storage/index/mbox/mbox-save.c b/src/lib-storage/index/mbox/mbox-save.c index 4572a495b7..f9a3891489 100644 --- a/src/lib-storage/index/mbox/mbox-save.c +++ b/src/lib-storage/index/mbox/mbox-save.c @@ -495,6 +495,7 @@ int mbox_save_begin(struct mail_save_context *_ctx, struct istream *input) _ctx->dest_mail = ctx->mail; } mail_set_seq(_ctx->dest_mail, ctx->seq); + _ctx->dest_mail->saving = TRUE; } mbox_save_append_flag_headers(ctx->headers, save_flags); mbox_save_append_keyword_headers(ctx, _ctx->keywords); diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 56a7388d5e..ce32672f34 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -251,6 +251,7 @@ struct mail { uint32_t seq, uid; unsigned int expunged:1; + unsigned int saving:1; /* This mail is still being saved */ unsigned int has_nuls:1; /* message data is known to contain NULs */ unsigned int has_no_nuls:1; /* -''- known to not contain NULs */ -- 2.47.3