From: Stephan Bosch Date: Wed, 15 Aug 2018 20:39:58 +0000 (+0200) Subject: lib-smtp: client: transaction: Prevent early transaction abort in smtp_client_transac... X-Git-Tag: 2.3.5~333 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4df412f8ab2604b3e987ab63e3398f7c776da9ff;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: transaction: Prevent early transaction abort in smtp_client_transaction_fail_reply(). Can happen in one of the command callbacks of aborted commands. --- diff --git a/src/lib-smtp/smtp-client-private.h b/src/lib-smtp/smtp-client-private.h index 1e5dc0d0ba..4f9c02dc26 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 5e4a619046..95a06eedae 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) */