From e305a608bfe5d0d0b09d661d0d7b1d0f4a2ea7b9 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Tue, 9 Feb 2021 23:35:53 +0100 Subject: [PATCH] lib-smtp: smtp-client-connection - Hold reference to command that is sending a stream. This fixes a panic: Panic: file smtp-client-command.c: line 715 (smtp_client_command_do_send_more): assertion failed: (cmd->stream != NULL) --- src/lib-smtp/smtp-client-command.c | 12 +++++++++--- src/lib-smtp/smtp-client-connection.c | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/lib-smtp/smtp-client-command.c b/src/lib-smtp/smtp-client-command.c index 594db8acfb..569fdd39e0 100644 --- a/src/lib-smtp/smtp-client-command.c +++ b/src/lib-smtp/smtp-client-command.c @@ -131,6 +131,7 @@ bool smtp_client_command_unref(struct smtp_client_command **_cmd) conn->cmd_wait_list_count, conn->cmd_send_queue_count); i_assert(cmd->state >= SMTP_CLIENT_COMMAND_STATE_FINISHED); + i_assert(cmd != conn->cmd_streaming); i_stream_unref(&cmd->stream); event_unref(&cmd->event); @@ -744,13 +745,18 @@ static int smtp_client_command_do_send_more(struct smtp_client_connection *conn) if (ret < 0) return -1; e_debug(cmd->event, "Blocked while sending payload"); - conn->cmd_streaming = cmd; + if (conn->cmd_streaming != cmd) { + i_assert(conn->cmd_streaming == NULL); + conn->cmd_streaming = cmd; + smtp_client_command_ref(cmd); + } return 0; } - conn->cmd_streaming = NULL; conn->sending_command = FALSE; - smtp_client_command_sent(cmd); + if (conn->cmd_streaming != cmd || + smtp_client_command_unref(&conn->cmd_streaming)) + smtp_client_command_sent(cmd); return 1; } diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index efbc3dfd75..91f7e06a3a 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -1880,7 +1880,7 @@ void smtp_client_connection_disconnect(struct smtp_client_connection *conn) conn, SMTP_CLIENT_COMMAND_ERROR_ABORTED, "Disconnected from server"); } - conn->cmd_streaming = NULL; + smtp_client_command_unref(&conn->cmd_streaming); } static struct smtp_client_connection * -- 2.47.3