]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Record the first failure reply of the DATA command.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 9 Feb 2019 13:39:24 +0000 (14:39 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 28 Jun 2019 07:09:30 +0000 (10:09 +0300)
This is needed when the DATA command yields more than a single reply (LMTP).

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

index e8eaa87b598577ce24e2e921909468faca0cb52e..883358bad9f07f607665ca400ece417ab9d3f964 100644 (file)
@@ -107,7 +107,7 @@ struct smtp_client_transaction {
        enum smtp_client_transaction_state state;
        struct smtp_client_command *cmd_data, *cmd_rset;
        struct smtp_client_command *cmd_plug, *cmd_last;
-       struct smtp_reply *failure, *mail_failure;
+       struct smtp_reply *failure, *mail_failure, *data_failure;
 
        struct smtp_client_transaction_mail *mail_head, *mail_tail;
        struct smtp_client_transaction_mail *mail_send;
index 59d8366092721db885903bcdc7c64c23c3e37215..09f4b25b6b166d24fe8ba8cfe3552c9f581e3246 100644 (file)
@@ -977,12 +977,14 @@ static void
 smtp_client_transaction_data_cb(const struct smtp_reply *reply,
                                struct smtp_client_transaction *trans)
 {
+       bool reply_per_rcpt = HAS_ALL_BITS(
+               trans->flags, SMTP_CLIENT_TRANSACTION_FLAG_REPLY_PER_RCPT);
+
        i_assert(!trans->reset);
 
        smtp_client_transaction_ref(trans);
 
-       if (HAS_ALL_BITS(trans->flags,
-                        SMTP_CLIENT_TRANSACTION_FLAG_REPLY_PER_RCPT) &&
+       if (reply_per_rcpt &&
            trans->cmd_data != NULL && /* NULL when failed early */
            trans->rcpts_data == NULL && trans->rcpts_count > 0) {
                smtp_client_command_set_replies(trans->cmd_data,
@@ -997,6 +999,10 @@ smtp_client_transaction_data_cb(const struct smtp_reply *reply,
                                 SMTP_CLIENT_TRANSACTION_FLAG_REPLY_PER_RCPT))
                        break;
        }
+
+       if (reply_per_rcpt && trans->rcpts_count > 1 &&
+           !smtp_reply_is_success(reply) && trans->data_failure == NULL)
+               trans->data_failure = smtp_reply_clone(trans->pool, reply);
        if (trans->rcpts_data != NULL) {
                smtp_client_transaction_unref(&trans);
                return;