diff --git a/src/lib-smtp/smtp-client-private.h b/src/lib-smtp/smtp-client-private.h index ec7a91b6ad..57a0229c7d 100644 --- a/src/lib-smtp/smtp-client-private.h +++ b/src/lib-smtp/smtp-client-private.h @@ -103,6 +103,7 @@ struct smtp_client_transaction { bool data_provided:1; bool finished:1; + bool failing:1; bool submitted_data:1; }; diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index 81df66fdf1..b1501eeb67 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -216,6 +216,9 @@ void smtp_client_transaction_abort(struct smtp_client_transaction *trans) struct smtp_client_transaction_rcpt **rcpts; unsigned int i, count; + if (trans->failing) + return; + smtp_client_transaction_debug(trans, "Abort"); /* clean up */ @@ -313,6 +316,8 @@ void smtp_client_transaction_fail_reply(struct smtp_client_transaction *trans, reply = trans->failure; i_assert(reply != NULL); + trans->failing = TRUE; + smtp_client_transaction_debug(trans, "Returning failure: %s", smtp_reply_log(reply)); @@ -386,6 +391,8 @@ void smtp_client_transaction_fail_reply(struct smtp_client_transaction *trans, smtp_client_command_abort(&trans->cmd_plug); trans->cmd_plug = NULL; + trans->failing = FALSE; + if (trans->data_provided) { /* abort the transaction only if smtp_client_transaction_send() was called (and if it is not aborted already) */