]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Fixed error handling in mailbox_copy().
authorTimo Sirainen <tss@iki.fi>
Thu, 18 Feb 2010 05:32:13 +0000 (07:32 +0200)
committerTimo Sirainen <tss@iki.fi>
Thu, 18 Feb 2010 05:32:13 +0000 (07:32 +0200)
--HG--
branch : HEAD

src/lib-storage/mail-copy.c

index 061190452314eb02a379c4a1d9162d430eb000d3..d738c159c7b52ea635acfdf8b10e38916a7c537e 100644 (file)
@@ -5,7 +5,8 @@
 #include "mail-storage-private.h"
 #include "mail-copy.h"
 
-int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail)
+static int
+mail_storage_try_copy(struct mail_save_context *ctx, struct mail *mail)
 {
        struct mail_private *pmail = (struct mail_private *)mail;
        struct istream *input;
@@ -48,18 +49,26 @@ int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail)
                        break;
        } while (i_stream_read(input) != -1);
 
+       if (input->stream_errno != 0) {
+               mail_storage_set_critical(ctx->transaction->box->storage,
+                                         "copy: i_stream_read() failed: %m");
+               return -1;
+       }
+       return 0;
+}
+
+int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail)
+{
        if (ctx->keywords != NULL) {
-               /* keywords gets unreferenced twice, because we call
-                  mailbox_save_cancel/finish */
+               /* keywords gets unreferenced twice: first in
+                  mailbox_save_cancel()/_finish() and second time in
+                  mailbox_copy(). */
                mailbox_keywords_ref(ctx->transaction->box, ctx->keywords);
        }
 
-       if (input->stream_errno != 0) {
-               mail_storage_set_critical(ctx->transaction->box->storage,
-                                         "copy: i_stream_read() failed: %m");
+       if (mail_storage_try_copy(ctx, mail) < 0) {
                mailbox_save_cancel(&ctx);
                return -1;
        }
-
        return mailbox_save_finish(&ctx);
 }