From: Stephan Bosch Date: Sat, 9 Feb 2019 13:18:02 +0000 (+0100) Subject: lib-smtp: smtp-client-transaction - Handle MAIL reply in a separate _mail function. X-Git-Tag: 2.3.9~799 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4cee6021b28d6b4e4bd147379d4b41f3af6792a2;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-client-transaction - Handle MAIL reply in a separate _mail function. --- diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index 9784e6734b..914088f8e6 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -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);