]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: Allocate each recipient on its own pool.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 7 Oct 2018 18:34:12 +0000 (20:34 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:41:00 +0000 (15:41 +0200)
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.

src/lib-smtp/Makefile.am
src/lib-smtp/smtp-server-cmd-rcpt.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-recipient.c [new file with mode: 0644]
src/lib-smtp/smtp-server-transaction.c
src/lib-smtp/smtp-server.h

index 6d1f950e63a1f62640a1ead038d163f2295fab16..d86dfb0eb03eedf366e5217b2b3e9026a44d6570 100644 (file)
@@ -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 \
index 93114762c8b15ad6a6b4ced6e40306b4f2421961..c383bd08b0326cc6150041b352063b573bc1b9cf 100644 (file)
@@ -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);
index 2a80948765a6e2a251d4d837c83f450be86c8a85..3d78040e33cb6c994d73a2bef723faec654a1c4a 100644 (file)
@@ -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 (file)
index 0000000..9589b71
--- /dev/null
@@ -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);
+}
index 753b355b2732416dcd1848f416be6ab8bd602488..c56fce75667a2d154d2e79f3bc7a2a25f9955ec6 100644 (file)
@@ -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)
index 9800ef94683fba8ff9fce80ca2be38e2636c2945..ff4c61b56d37c804b188d29c81d03dbb9dcf3c80 100644 (file)
@@ -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;