]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Properly handle pending failure upon smtp_client_...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Thu, 22 Apr 2021 10:13:35 +0000 (12:13 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 21 May 2021 20:20:48 +0000 (20:20 +0000)
src/lib-smtp/smtp-client-transaction.c

index 16e878fa8f00f88ae2e15ec7d9d097df26bd3fc1..be1750825db9d4cdbbfc485a0ba8ce34e40bd9b5 100644 (file)
@@ -1244,24 +1244,36 @@ smtp_client_transaction_rset_cb(const struct smtp_reply *reply,
 static void
 smtp_client_transaction_send_reset(struct smtp_client_transaction *trans)
 {
+       struct smtp_reply failure;
+
        i_assert(trans->reset);
 
        e_debug(trans->event, "Sending reset");
 
        timeout_remove(&trans->to_send);
 
-       trans->cmd_rset = smtp_client_command_rset_submit_after(
-               trans->conn, 0, trans->cmd_last,
-               smtp_client_transaction_rset_cb, trans);
+       i_zero(&failure);
+       if (trans->failure != NULL) {
+               smtp_client_transaction_fail_reply(trans, trans->failure);
+               failure = *trans->failure;
+               i_assert(failure.status != 0);
+       } else {
+               trans->cmd_rset = smtp_client_command_rset_submit_after(
+                       trans->conn, 0, trans->cmd_last,
+                       smtp_client_transaction_rset_cb, trans);
 
-       if (trans->cmd_last != NULL)
-               smtp_client_command_unlock(trans->cmd_last);
+               if (trans->cmd_last != NULL)
+                       smtp_client_command_unlock(trans->cmd_last);
 
-       smtp_client_transaction_try_complete(trans);
+               smtp_client_transaction_try_complete(trans);
+       }
 
        if (trans->cmd_plug != NULL)
                smtp_client_command_abort(&trans->cmd_plug);
        trans->cmd_last = NULL;
+
+       if (failure.status != 0)
+               smtp_client_transaction_finish(trans, &failure);
 }
 
 #undef smtp_client_transaction_reset