]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client-transaction - Handle MAIL reply in a separate _mail function.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 9 Feb 2019 13:18:02 +0000 (14:18 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Tue, 19 Feb 2019 22:32:57 +0000 (23:32 +0100)
src/lib-smtp/smtp-client-transaction.c

index 9784e6734b9683396aa96397474894ebc5dc1d2d..914088f8e69e28f144d862a63806d1a4b03ff89d 100644 (file)
@@ -82,6 +82,24 @@ smtp_client_transaction_mail_free(struct smtp_client_transaction_mail **_mail)
        pool_unref(&mail->pool);
 }
 
+static void
+smtp_client_transaction_mail_replied(
+       struct smtp_client_transaction_mail **_mail,
+       const struct smtp_reply *reply)
+{
+       struct smtp_client_transaction_mail *mail = *_mail;
+       smtp_client_command_callback_t *mail_callback = mail->mail_callback;
+       void *context = mail->context;
+
+       mail->mail_callback = NULL;
+
+       /* call the callback */
+       if (mail_callback != NULL)
+               mail_callback(reply, context);
+
+       smtp_client_transaction_mail_free(_mail);
+}
+
 void smtp_client_transaction_mail_abort(
        struct smtp_client_transaction_mail **_mail)
 {
@@ -661,20 +679,20 @@ smtp_client_transaction_mail_cb(const struct smtp_reply *reply,
        else if (trans->reset)
                trans->state = SMTP_CLIENT_TRANSACTION_STATE_RESET;
 
-       if (mail->mail_callback != NULL) {
+       {
                enum smtp_client_transaction_state state;
                struct smtp_client_transaction *tmp_trans = trans;
 
                smtp_client_transaction_ref(tmp_trans);
-               mail->mail_callback(reply, mail->context);
+
+               smtp_client_transaction_mail_replied(&mail, reply);
+
                state = trans->state;
                smtp_client_transaction_unref(&tmp_trans);
                if (state >= SMTP_CLIENT_TRANSACTION_STATE_FINISHED)
                        return;
        }
 
-       smtp_client_transaction_mail_free(&mail);
-
        if (!success && !trans->sender_accepted) {
                if (trans->state > SMTP_CLIENT_TRANSACTION_STATE_MAIL_FROM)
                        smtp_client_transaction_fail_reply(trans, reply);