]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap: Improved "EOF while appending" disconnect log message.
authorTimo Sirainen <tss@iki.fi>
Fri, 11 Oct 2013 16:27:39 +0000 (19:27 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 11 Oct 2013 16:27:39 +0000 (19:27 +0300)
src/imap/cmd-append.c

index eb20fbb129e49040c977faae8f8ddb54d68e38f4..164704999dd9e03434dff9541e202fc348b991df 100644 (file)
@@ -52,7 +52,8 @@ static void cmd_append_finish(struct cmd_append_context *ctx);
 static bool cmd_append_continue_message(struct client_command_context *cmd);
 static bool cmd_append_parse_new_msg(struct client_command_context *cmd);
 
-static const char *get_disconnect_reason(struct cmd_append_context *ctx)
+static const char *
+get_disconnect_reason(struct cmd_append_context *ctx, uoff_t lit_offset)
 {
        string_t *str = t_str_new(128);
        unsigned int secs = ioloop_time - ctx->started;
@@ -61,7 +62,7 @@ static const char *get_disconnect_reason(struct cmd_append_context *ctx)
                    ctx->count, secs);
        if (ctx->litinput != NULL) {
                str_printfa(str, ", %"PRIuUOFF_T"/%"PRIuUOFF_T" bytes",
-                           ctx->litinput->v_offset, ctx->literal_size);
+                           lit_offset, ctx->literal_size);
        }
        str_append_c(str, ')');
        return str_c(str);
@@ -82,7 +83,7 @@ static void client_input_append(struct client_command_context *cmd)
        switch (i_stream_read(client->input)) {
        case -1:
                /* disconnected */
-               reason = get_disconnect_reason(ctx);
+               reason = get_disconnect_reason(ctx, ctx->litinput->v_offset);
                cmd_append_finish(cmd->context);
                /* Reset command so that client_destroy() doesn't try to call
                   cmd_append_continue_message() anymore. */
@@ -825,7 +826,7 @@ static bool cmd_append_continue_message(struct client_command_context *cmd)
        }
 
        if (ctx->litinput->eof || client->input->closed) {
-               bool all_written = ctx->litinput->v_offset == ctx->literal_size;
+               uoff_t lit_offset = ctx->litinput->v_offset;
 
                /* finished - do one more read, to make sure istream-chain
                   unreferences its stream, which is needed for litinput's
@@ -843,12 +844,13 @@ static bool cmd_append_continue_message(struct client_command_context *cmd)
                        /* failed above */
                        client_send_storage_error(cmd, ctx->storage);
                        ctx->failed = TRUE;
-               } else if (!all_written) {
+               } else if (lit_offset != ctx->literal_size) {
                        /* client disconnected before it finished sending the
                           whole message. */
                        ctx->failed = TRUE;
                        mailbox_save_cancel(&ctx->save_ctx);
-                       client_disconnect(client, "EOF while appending");
+                       client_disconnect(client,
+                               get_disconnect_reason(ctx, lit_offset));
                } else if (ctx->catenate) {
                        /* CATENATE isn't finished yet */
                } else if (mailbox_save_finish(&ctx->save_ctx) < 0) {