From: Stephan Bosch Date: Sat, 13 Jan 2018 10:53:43 +0000 (+0100) Subject: lmtp: local: Don't deliver more than once to the same recipient. X-Git-Tag: 2.3.9~2515 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=80f5e1ea615677c1c37be6e7abb888c9cc22de3b;p=thirdparty%2Fdovecot%2Fcore.git lmtp: local: Don't deliver more than once to the same recipient. Duplicate RCPT TO commands for local recipients are now mostly ignored, by repeating the reply for the first instance of that RCPT TO command. --- diff --git a/src/lmtp/lmtp-common.c b/src/lmtp/lmtp-common.c index 612ec57a62..b3f13dec41 100644 --- a/src/lmtp/lmtp-common.c +++ b/src/lmtp/lmtp-common.c @@ -26,3 +26,23 @@ void lmtp_recipient_finish(struct lmtp_recipient *rcpt, rcpt->index = index; rcpt->rcpt_cmd = NULL; } + +struct lmtp_recipient * +lmtp_recipient_find_duplicate(struct lmtp_recipient *rcpt, + struct smtp_server_transaction *trans) +{ + struct smtp_server_recipient *drcpt; + struct lmtp_recipient *dup_rcpt; + + i_assert(rcpt->rcpt != NULL); + drcpt = smtp_server_transaction_find_rcpt_duplicate(trans, rcpt->rcpt); + if (drcpt == NULL) + return NULL; + + dup_rcpt = drcpt->context; + i_assert(dup_rcpt->rcpt == drcpt); + i_assert(dup_rcpt->type == rcpt->type); + + return dup_rcpt; +} + diff --git a/src/lmtp/lmtp-common.h b/src/lmtp/lmtp-common.h index e7e90d757f..664f933f6e 100644 --- a/src/lmtp/lmtp-common.h +++ b/src/lmtp/lmtp-common.h @@ -32,4 +32,8 @@ void lmtp_recipient_finish(struct lmtp_recipient *rcpt, struct smtp_server_recipient *trcpt, unsigned int index); +struct lmtp_recipient * +lmtp_recipient_find_duplicate(struct lmtp_recipient *rcpt, + struct smtp_server_transaction *trans); + #endif diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 9c313c0116..c770e35e5b 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -41,6 +41,8 @@ struct lmtp_local_recipient { struct mail_storage_service_user *service_user; struct anvil_query *anvil_query; + struct lmtp_local_recipient *duplicate; + bool anvil_connect_sent:1; }; @@ -253,7 +255,7 @@ lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *rcpt) static void lmtp_local_rcpt_finished( struct smtp_server_cmd_ctx *cmd, - struct smtp_server_transaction *trans ATTR_UNUSED, + struct smtp_server_transaction *trans, struct smtp_server_recipient *trcpt, unsigned int index) { @@ -271,6 +273,11 @@ static void lmtp_local_rcpt_finished( lmtp_recipient_finish(&rcpt->rcpt, trcpt, index); + /* resolve duplicate recipient */ + rcpt->duplicate = (struct lmtp_local_recipient *) + lmtp_recipient_find_duplicate(&rcpt->rcpt, trans); + i_assert(rcpt->duplicate == NULL || rcpt->duplicate->duplicate == NULL); + /* add to local recipients */ array_append(&client->local->rcpt_to, &rcpt, 1); } @@ -651,6 +658,13 @@ lmtp_local_deliver_to_rcpts(struct lmtp_local *local, for (i = 0; i < count; i++) { struct lmtp_local_recipient *rcpt = rcpts[i]; + if (rcpt->duplicate != NULL) { + /* don't deliver more than once to the same recipient */ + smtp_server_reply_submit_duplicate(cmd, + rcpt->rcpt.index, rcpt->duplicate->rcpt.index); + continue; + } + ret = lmtp_local_deliver(local, cmd, trans, rcpt, src_mail, session); i_set_failure_prefix("lmtp(%s): ", my_pid);