]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: transaction: Prevent early transaction abort in smtp_client_transac...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Wed, 15 Aug 2018 20:39:58 +0000 (22:39 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 22 Aug 2018 08:50:33 +0000 (08:50 +0000)
Can happen in one of the command callbacks of aborted commands.

src/lib-smtp/smtp-client-private.h
src/lib-smtp/smtp-client-transaction.c

index ec7a91b6ad3e862b3755919423c9aea8bb3da271..57a0229c7d6b1ff1a90618e53c8e6cf752ba5192 100644 (file)
@@ -103,6 +103,7 @@ struct smtp_client_transaction {
 
        bool data_provided:1;
        bool finished:1;
+       bool failing:1;
        bool submitted_data:1;
 };
 
index 81df66fdf143553ab8394793d4d7d949b8a16233..b1501eeb677ec32b33ae2988684b4dc0e0864c31 100644 (file)
@@ -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) */