]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: Fully disconnect the connection upon failure before triggering...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 29 Sep 2018 16:28:29 +0000 (18:28 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:48 +0000 (15:40 +0200)
src/lib-smtp/smtp-client-connection.c
src/lib-smtp/smtp-client-private.h
src/lib-smtp/smtp-client-transaction.c

index c6f2501dc4a9201ef58af44240522cd111d2068b..e54c720d2efc1cad4595c6ee433340ec122ba15f 100644 (file)
@@ -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);
index 3ef1029175627fe5ca2363ffa6ac42f228fed554..a880f772cbf417e97cca799b207cad6f7104e403 100644 (file)
@@ -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;
 };
index 717e0346fee9d01db13a2b744e2eebabfda12bda..42497b7c2a5db17bf6be729e548b0917f529faf0 100644 (file)
@@ -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;