From: Stephan Bosch Date: Sun, 7 Oct 2018 18:34:12 +0000 (+0200) Subject: lib-smtp: server: Allocate each recipient on its own pool. X-Git-Tag: 2.3.5~130 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6c939b142ea6d25d3dbabc2f1cb2cc792910d41f;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: server: Allocate each recipient on its own pool. This way, the application can associate data with the recipient, which implicitly goes away either when the transaction is finished or the recipient is denied. --- diff --git a/src/lib-smtp/Makefile.am b/src/lib-smtp/Makefile.am index 6d1f950e63..d86dfb0eb0 100644 --- a/src/lib-smtp/Makefile.am +++ b/src/lib-smtp/Makefile.am @@ -41,6 +41,7 @@ libsmtp_la_SOURCES = \ $(smtp_server_cmds) \ smtp-server-reply.c \ smtp-server-command.c \ + smtp-server-recipient.c \ smtp-server-transaction.c \ smtp-server-connection.c \ smtp-server.c \ diff --git a/src/lib-smtp/smtp-server-cmd-rcpt.c b/src/lib-smtp/smtp-server-cmd-rcpt.c index 93114762c8..c383bd08b0 100644 --- a/src/lib-smtp/smtp-server-cmd-rcpt.c +++ b/src/lib-smtp/smtp-server-cmd-rcpt.c @@ -55,10 +55,12 @@ cmd_rcpt_completed(struct smtp_server_cmd_ctx *cmd, } /* success */ - rcpt = smtp_server_transaction_add_rcpt(trans, data->path, - &data->params); + rcpt = smtp_server_recipient_create(conn, data->path); + smtp_params_rcpt_copy(rcpt->pool, &rcpt->params, &data->params); rcpt->context = data->trans_context; + smtp_server_recipient_approved(rcpt); + if (data->hook_finished != NULL) { data->hook_finished(cmd, trans, rcpt, array_count(&trans->rcpt_to) - 1); diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index 2a80948765..3d78040e33 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -351,6 +351,17 @@ smtp_server_connection_get_transaction(struct smtp_server_connection *conn); void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn, const struct smtp_proxy_data *proxy_data); +/* + * Recipient + */ + +struct smtp_server_recipient * +smtp_server_recipient_create(struct smtp_server_connection *conn, + const struct smtp_address *rcpt_to); +void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt); + +void smtp_server_recipient_approved(struct smtp_server_recipient *rcpt); + /* * Transaction */ @@ -362,10 +373,8 @@ smtp_server_transaction_create(struct smtp_server_connection *conn, const struct timeval *timestamp); void smtp_server_transaction_free(struct smtp_server_transaction **_trans); -struct smtp_server_recipient * -smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans, - const struct smtp_address *rcpt_to, - const struct smtp_params_rcpt *params); +void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans, + struct smtp_server_recipient *rcpt); bool smtp_server_transaction_has_rcpt(struct smtp_server_transaction *trans); unsigned int smtp_server_transaction_rcpt_count(struct smtp_server_transaction *trans); diff --git a/src/lib-smtp/smtp-server-recipient.c b/src/lib-smtp/smtp-server-recipient.c new file mode 100644 index 0000000000..9589b71de6 --- /dev/null +++ b/src/lib-smtp/smtp-server-recipient.c @@ -0,0 +1,43 @@ +/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "smtp-address.h" + +#include "smtp-server-private.h" + +struct smtp_server_recipient * +smtp_server_recipient_create(struct smtp_server_connection *conn, + const struct smtp_address *rcpt_to) +{ + struct smtp_server_recipient *rcpt; + pool_t pool; + + pool = pool_alloconly_create("smtp server recipient", 512); + rcpt = p_new(pool, struct smtp_server_recipient, 1); + rcpt->pool = pool; + rcpt->conn = conn; + rcpt->path = smtp_address_clone(pool, rcpt_to); + + return rcpt; +} + +void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt) +{ + struct smtp_server_recipient *rcpt = *_rcpt; + + *_rcpt = NULL; + + if (rcpt == NULL) + return; + + pool_unref(&rcpt->pool); +} + +void smtp_server_recipient_approved(struct smtp_server_recipient *rcpt) +{ + struct smtp_server_transaction *trans = rcpt->conn->state.trans; + + i_assert(trans != NULL); + + smtp_server_transaction_add_rcpt(trans, rcpt); +} diff --git a/src/lib-smtp/smtp-server-transaction.c b/src/lib-smtp/smtp-server-transaction.c index 753b355b27..c56fce7566 100644 --- a/src/lib-smtp/smtp-server-transaction.c +++ b/src/lib-smtp/smtp-server-transaction.c @@ -46,6 +46,12 @@ smtp_server_transaction_create(struct smtp_server_connection *conn, void smtp_server_transaction_free(struct smtp_server_transaction **_trans) { struct smtp_server_transaction *trans = *_trans; + struct smtp_server_recipient **rcptp; + + if (array_is_created(&trans->rcpt_to)) { + array_foreach_modifiable(&trans->rcpt_to, rcptp) + smtp_server_recipient_destroy(rcptp); + } pool_unref(&trans->pool); *_trans = NULL; @@ -71,23 +77,15 @@ smtp_server_transaction_find_rcpt_duplicate( return NULL; } -struct smtp_server_recipient * -smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans, - const struct smtp_address *rcpt_to, - const struct smtp_params_rcpt *params) +void smtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans, + struct smtp_server_recipient *rcpt) { - struct smtp_server_recipient *rcpt; - - rcpt = p_new(trans->pool, struct smtp_server_recipient, 1); - rcpt->path = smtp_address_clone(trans->pool, rcpt_to); - smtp_params_rcpt_copy(trans->pool, &rcpt->params, params); - if (!array_is_created(&trans->rcpt_to)) p_array_init(&trans->rcpt_to, trans->pool, 8); - array_append(&trans->rcpt_to, &rcpt, 1); + rcpt->trans = trans; - return rcpt; + array_append(&trans->rcpt_to, &rcpt, 1); } bool smtp_server_transaction_has_rcpt(struct smtp_server_transaction *trans) diff --git a/src/lib-smtp/smtp-server.h b/src/lib-smtp/smtp-server.h index 9800ef9468..ff4c61b56d 100644 --- a/src/lib-smtp/smtp-server.h +++ b/src/lib-smtp/smtp-server.h @@ -45,10 +45,14 @@ struct smtp_server_helo_data { }; /* - * Transaction + * Recipient */ struct smtp_server_recipient { + pool_t pool; + struct smtp_server_connection *conn; + struct smtp_server_transaction *trans; + struct smtp_address *path; struct smtp_params_rcpt params; @@ -56,6 +60,10 @@ struct smtp_server_recipient { }; ARRAY_DEFINE_TYPE(smtp_server_recipient, struct smtp_server_recipient *); +/* + * Transaction + */ + struct smtp_server_transaction { pool_t pool; struct smtp_server_connection *conn;