From: Stephan Bosch Date: Mon, 10 Jan 2022 02:54:13 +0000 (+0100) Subject: lib-smtp: smtp-client-transaction - Plug the command pipeline while transaction is... X-Git-Tag: 2.3.19~133 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d79841aa3447302d410d86df09bd2e2c049d4bc9;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-client-transaction - Plug the command pipeline while transaction is pending. This prevents commands submitted after creating the transaction from being exectuted out-of-order before the transaction's MAIL command. --- diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index 43baac7e86..0112021f3c 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -1017,6 +1017,9 @@ void smtp_client_transaction_start( if (!trans->submitting) smtp_client_transaction_submit_more(trans); + } else if (trans->cmd_last == NULL) { + trans->cmd_plug = trans->cmd_last = + smtp_client_command_plug(trans->conn, NULL); } } @@ -1361,9 +1364,6 @@ smtp_client_transaction_do_submit_more(struct smtp_client_transaction *trans) { timeout_remove(&trans->to_send); - if (trans->immediate) - trans->cmd_last = NULL; - /* Check whether we already failed */ if (trans->failure == NULL && trans->state > SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM) @@ -1388,8 +1388,13 @@ smtp_client_transaction_do_submit_more(struct smtp_client_transaction *trans) return; } - if (trans->state <= SMTP_CLIENT_TRANSACTION_STATE_PENDING) + if (trans->state <= SMTP_CLIENT_TRANSACTION_STATE_PENDING) { + if (trans->cmd_last == NULL) { + trans->cmd_plug = trans->cmd_last = + smtp_client_command_plug(trans->conn, NULL); + } return; + } /* MAIL */ if (trans->mail_send != NULL) { @@ -1407,15 +1412,13 @@ smtp_client_transaction_do_submit_more(struct smtp_client_transaction *trans) trans->mail_send = trans->mail_send->next; mail->cmd_mail_from = trans->cmd_last = - smtp_client_command_mail_submit( - trans->conn, 0, + smtp_client_command_mail_submit_after( + trans->conn, 0, trans->cmd_last, mail->mail_from, &mail->mail_params, smtp_client_transaction_mail_cb, trans); } - - if (!trans->immediate) - smtp_client_command_lock(trans->cmd_last); - } + } else if (trans->immediate) + trans->cmd_last = NULL; /* RCPT */ if (trans->rcpts_send != NULL) { @@ -1435,13 +1438,13 @@ smtp_client_transaction_do_submit_more(struct smtp_client_transaction *trans) rcpt->rcpt_to, &rcpt->rcpt_params, smtp_client_transaction_rcpt_cb, rcpt); } - if (!trans->immediate) - smtp_client_command_lock(trans->cmd_last); } if (trans->cmd_plug != NULL && (trans->immediate || trans->cmd_last != trans->cmd_plug)) smtp_client_command_abort(&trans->cmd_plug); + if (trans->cmd_last != NULL && !trans->immediate) + smtp_client_command_lock(trans->cmd_last); /* DATA / RSET */ if (trans->reset) {