]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fixed accessing uncommitted saved mails with dsync
authorTimo Sirainen <tss@iki.fi>
Fri, 4 Jun 2010 18:16:42 +0000 (19:16 +0100)
committerTimo Sirainen <tss@iki.fi>
Fri, 4 Jun 2010 18:16:42 +0000 (19:16 +0100)
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
src/lib-storage/index/dbox-common/dbox-save.c
src/lib-storage/index/dbox-multi/mdbox-mail.c
src/lib-storage/index/dbox-multi/mdbox-save.c
src/lib-storage/index/dbox-single/sdbox-copy.c
src/lib-storage/index/dbox-single/sdbox-mail.c
src/lib-storage/index/index-mail.c
src/lib-storage/index/maildir/maildir-mail.c
src/lib-storage/index/maildir/maildir-save.c
src/lib-storage/index/mbox/mbox-save.c
src/lib-storage/mail-storage.h

index 40444c64756e9f8feab1497eb458e5d57b86f412..a86b3b7c362d497103d2afcd02a56a31569ea0e0 100644 (file)
@@ -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);
index da86e7da49de6934685c440af2ac5f7032d4a4f0..657fe12d70ab1bec115f11ad146a8428d4c680da 100644 (file)
@@ -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);
index 4899803438e4065de8143f8ee21edf753d8af910..0f20708ea48db241643c2d8cdea7d6e445693025 100644 (file)
@@ -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;
index d934940226996104dffc9e241c0fbb104e84304d..fa354602a7dd631bb6ded6ad3462ff63a29922e2 100644 (file)
@@ -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;
 }
index 8b9f6b80722feca20cf4dce3375de1979b6f4052..5e122dd9ee0964d03773d227ce9f0d6bb5dca3ae 100644 (file)
@@ -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;
 }
 
index 4212483ffafb82f18d1825fab9fed84078fb2e19..d74e409648a3acf37e56d48d49b02617596087f8 100644 (file)
@@ -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 {
index d4a74c6fd2876b6eae2e2a318f354e2c095fcb5e..e33b1bc08120ae844e13be0bbe5e40841236e81f 100644 (file)
@@ -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)
index 5f780c171c160bb8891f23dfd22e9e54f1b60735..97098e9d2eae73e058699dc84af3cdbc6ec66d26 100644 (file)
@@ -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 {
index c42c248efd336e1eaafc8e4bfb12782a5214c67f..163e5f7681cdad85dcc6d36d4eac2b251c82af2f 100644 (file)
@@ -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
index 4572a495b7ad8457e6cd6bd88383e60b502798b6..f9a3891489635fd6bb32eb4e5825d5ae78348165 100644 (file)
@@ -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);
index 56a7388d5e2dc83adb832e5d350be06520a343c9..ce32672f3455fe50853f2339319a9a309abddefc 100644 (file)
@@ -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 */