From e3abd5319b33bec1a4574ca42a16f31d64c58488 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Thu, 16 Aug 2018 00:42:50 +0200 Subject: [PATCH] lib-smtp: client: Fix transaction state transition for the DATA command. It progressed to the DATA state too early. By the looks of things, this only affected the correctness of error and debug messages. It does not affect the transaction itself. --- src/lib-smtp/smtp-client-transaction.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index 0f486c6b39..d490ebbdaf 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -549,10 +549,11 @@ smtp_client_transaction_rcpt_cb(const struct smtp_reply *reply, rcpt_callback(reply, context); - /* abort DATA command if all recipients failed */ - if (trans->cmd_data != NULL && - array_count(&trans->rcpts_pending) == 0) { + if (trans->data_provided && array_count(&trans->rcpts_pending) == 0) { + trans->state = SMTP_CLIENT_TRANSACTION_STATE_DATA; + if (array_count(&trans->rcpts) == 0) { + /* abort transaction if all recipients failed */ smtp_client_transaction_abort(trans); } else if (conn->protocol == SMTP_PROTOCOL_LMTP) { smtp_client_command_set_replies(trans->cmd_data, @@ -631,6 +632,8 @@ void smtp_client_transaction_add_rcpt( smtp_client_transaction_debug(trans, "Add recipient"); + i_assert(!trans->data_provided); + i_assert(trans->state < SMTP_CLIENT_TRANSACTION_STATE_FINISHED); if (trans->cmd_mail_from == NULL && @@ -700,8 +703,6 @@ smtp_client_transaction_send_data(struct smtp_client_transaction *trans) timeout_remove(&trans->to_send); - trans->state = SMTP_CLIENT_TRANSACTION_STATE_DATA; - if (trans->failure != NULL) { smtp_client_transaction_fail_reply(trans, trans->failure); finished = TRUE; @@ -719,6 +720,7 @@ smtp_client_transaction_send_data(struct smtp_client_transaction *trans) smtp_client_command_unlock(trans->cmd_last); if (array_count(&trans->rcpts_pending) == 0) { + trans->state = SMTP_CLIENT_TRANSACTION_STATE_DATA; smtp_client_command_set_replies(trans->cmd_data, array_count(&trans->rcpts)); } -- 2.47.3