]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Plug the command pipeline while transaction is...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 10 Jan 2022 02:54:13 +0000 (03:54 +0100)
committerMartti Rannanjärvi <martti.rannanjarvi@open-xchange.com>
Fri, 21 Jan 2022 07:37:26 +0000 (09:37 +0200)
This prevents commands submitted after creating the transaction from being
exectuted out-of-order before the transaction's MAIL command.

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

index 43baac7e86e97ed50caa362d50ca0064b825458b..0112021f3c6e600aaedfd05cbf3032e1ff6e8b53 100644 (file)
@@ -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) {