From 773ab6e709577de38a99a66bd2a28f20b677da84 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 29 Sep 2018 18:28:29 +0200 Subject: [PATCH] lib-smtp: client: Fully disconnect the connection upon failure before triggering failure callbacks. --- src/lib-smtp/smtp-client-connection.c | 29 +++++++++++++++++++------- src/lib-smtp/smtp-client-private.h | 1 + src/lib-smtp/smtp-client-transaction.c | 21 +++++++------------ 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index c6f2501dc4..e54c720d2e 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -290,10 +290,10 @@ smtp_client_connection_fail_reply(struct smtp_client_connection *conn, "Connection failed: %s", smtp_reply_log(reply)); smtp_client_connection_ref(conn); + conn->failing = TRUE; - smtp_client_connection_login_callback(conn, reply); - smtp_client_connection_commands_fail_reply(conn, reply); smtp_client_connection_disconnect(conn); + smtp_client_connection_login_callback(conn, reply); trans = conn->transactions_head; while (trans != NULL) { @@ -302,6 +302,9 @@ smtp_client_connection_fail_reply(struct smtp_client_connection *conn, trans = trans_next; } + smtp_client_connection_commands_fail_reply(conn, reply); + + conn->failing = FALSE; smtp_client_connection_unref(&conn); } @@ -1706,12 +1709,15 @@ void smtp_client_connection_disconnect(struct smtp_client_connection *conn) smtp_client_connection_set_state(conn, SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED); - smtp_client_connection_login_fail(conn, - SMTP_CLIENT_COMMAND_ERROR_ABORTED, - "Disconnected from server"); - smtp_client_connection_commands_fail(conn, - SMTP_CLIENT_COMMAND_ERROR_ABORTED, - "Disconnected from server"); + + if (!conn->failing) { + smtp_client_connection_login_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_ABORTED, + "Disconnected from server"); + smtp_client_connection_commands_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_ABORTED, + "Disconnected from server"); + } } struct smtp_client_connection * @@ -1863,6 +1869,13 @@ void smtp_client_connection_unref(struct smtp_client_connection **_conn) if (conn->reply_parser != NULL) smtp_reply_parser_deinit(&conn->reply_parser); + smtp_client_connection_login_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_ABORTED, + "Connection destroy"); + smtp_client_connection_commands_fail(conn, + SMTP_CLIENT_COMMAND_ERROR_ABORTED, + "Connection destroy"); + connection_deinit(&conn->conn); i_free(conn->ips); diff --git a/src/lib-smtp/smtp-client-private.h b/src/lib-smtp/smtp-client-private.h index 3ef1029175..a880f772cb 100644 --- a/src/lib-smtp/smtp-client-private.h +++ b/src/lib-smtp/smtp-client-private.h @@ -198,6 +198,7 @@ struct smtp_client_connection { bool sent_quit:1; bool sending_command:1; bool reset_needed:1; + bool failing:1; bool destroying:1; bool closed:1; }; diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index 717e0346fe..42497b7c2a 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -331,19 +331,16 @@ void smtp_client_transaction_abort(struct smtp_client_transaction *trans) struct smtp_client_transaction_rcpt *rcpt = trans->rcpts_queue_head; - if (rcpt->cmd_rcpt_to != NULL && - conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED) + if (rcpt->cmd_rcpt_to != NULL) smtp_client_command_abort(&rcpt->cmd_rcpt_to); smtp_client_transaction_rcpt_free(&rcpt); } - if (conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED) { - if (trans->cmd_data != NULL) - smtp_client_command_abort(&trans->cmd_data); - if (trans->cmd_rset != NULL) - smtp_client_command_abort(&trans->cmd_rset); - if (trans->cmd_plug != NULL) - smtp_client_command_abort(&trans->cmd_plug); - } + if (trans->cmd_data != NULL) + smtp_client_command_abort(&trans->cmd_data); + if (trans->cmd_rset != NULL) + smtp_client_command_abort(&trans->cmd_rset); + if (trans->cmd_plug != NULL) + smtp_client_command_abort(&trans->cmd_plug); trans->cmd_data = NULL; trans->cmd_rset = NULL; trans->cmd_plug = NULL; @@ -431,7 +428,6 @@ void smtp_client_transaction_destroy(struct smtp_client_transaction **_trans) void smtp_client_transaction_fail_reply(struct smtp_client_transaction *trans, const struct smtp_reply *reply) { - struct smtp_client_connection *conn = trans->conn; struct smtp_client_transaction_rcpt *rcpt, *rcpt_next; if (reply == NULL) @@ -520,8 +516,7 @@ void smtp_client_transaction_fail_reply(struct smtp_client_transaction *trans, /* plug */ if (trans->failure == NULL) trans->failure = smtp_reply_clone(trans->pool, reply); - if (trans->cmd_plug != NULL && - conn->state != SMTP_CLIENT_CONNECTION_STATE_DISCONNECTED) + if (trans->cmd_plug != NULL) smtp_client_command_abort(&trans->cmd_plug); trans->cmd_plug = NULL; -- 2.47.3