From: Timo Sirainen Date: Wed, 6 Nov 2013 10:53:58 +0000 (+0200) Subject: imap: Fixed potential crash if client disconnected during APPEND. X-Git-Tag: 2.2.8~51 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d85bf560c8b25cd8762207fce0f74e2f97013f0;p=thirdparty%2Fdovecot%2Fcore.git imap: Fixed potential crash if client disconnected during APPEND. --- diff --git a/src/imap/cmd-append.c b/src/imap/cmd-append.c index 164704999d..b4099d7fe1 100644 --- a/src/imap/cmd-append.c +++ b/src/imap/cmd-append.c @@ -60,7 +60,7 @@ get_disconnect_reason(struct cmd_append_context *ctx, uoff_t lit_offset) str_printfa(str, "Disconnected in APPEND (%u msgs, %u secs", ctx->count, secs); - if (ctx->litinput != NULL) { + if (ctx->literal_size > 0) { str_printfa(str, ", %"PRIuUOFF_T"/%"PRIuUOFF_T" bytes", lit_offset, ctx->literal_size); } @@ -74,6 +74,7 @@ static void client_input_append(struct client_command_context *cmd) struct client *client = cmd->client; const char *reason; bool finished; + uoff_t lit_offset; i_assert(!client->destroyed); @@ -83,7 +84,9 @@ static void client_input_append(struct client_command_context *cmd) switch (i_stream_read(client->input)) { case -1: /* disconnected */ - reason = get_disconnect_reason(ctx, ctx->litinput->v_offset); + lit_offset = ctx->litinput == NULL ? 0 : + ctx->litinput->v_offset; + reason = get_disconnect_reason(ctx, lit_offset); cmd_append_finish(cmd->context); /* Reset command so that client_destroy() doesn't try to call cmd_append_continue_message() anymore. */