]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-server - Provide RCPT parameters as parameter to smtp_server_recipient...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 14 Feb 2019 00:05:57 +0000 (01:05 +0100)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 2 Mar 2019 10:57:17 +0000 (11:57 +0100)
Needed for event API, but also fixes a memory leak occurring upon parameter
parse error.

src/lib-smtp/smtp-server-cmd-rcpt.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-recipient.c

index a40ce8202adb5b501d685504295cd0f04c453657..65186deff0ddf40a5d010138e2e80196e8b1bd94 100644 (file)
@@ -101,6 +101,7 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
        enum smtp_address_parse_flags path_parse_flags;
        const char *const *param_extensions = NULL;
        struct smtp_address *path;
+       struct smtp_params_rcpt rcpt_params;
        enum smtp_param_parse_error pperror;
        const char *error;
        int ret;
@@ -157,16 +158,12 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
                return;
        }
 
-       rcpt = smtp_server_recipient_create(cmd, path);
-
-       rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1);
-       rcpt_data->rcpt = rcpt;
-
        /* [SP Rcpt-parameters] */
        if (array_is_created(&conn->rcpt_param_extensions))
                param_extensions = array_front(&conn->rcpt_param_extensions);
-       if (smtp_params_rcpt_parse(rcpt->pool, params, caps, param_extensions,
-                                  &rcpt->params, &pperror, &error) < 0) {
+       if (smtp_params_rcpt_parse(pool_datastack_create(), params, caps,
+                                  param_extensions, &rcpt_params, &pperror,
+                                  &error) < 0) {
                switch (pperror) {
                case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
                        smtp_server_reply(cmd,
@@ -182,6 +179,11 @@ void smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
                return;
        }
 
+       rcpt = smtp_server_recipient_create(cmd, path, &rcpt_params);
+
+       rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1);
+       rcpt_data->rcpt = rcpt;
+
        smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_NEXT,
                                     cmd_rcpt_recheck, rcpt_data);
        smtp_server_command_add_hook(command, SMTP_SERVER_COMMAND_HOOK_COMPLETED,
index 7884520ccba44c8879f069e50182b020eabbead5..c650205ec7397566ec5c042e31ac677e220b341d 100644 (file)
@@ -373,7 +373,8 @@ void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn,
 
 struct smtp_server_recipient *
 smtp_server_recipient_create(struct smtp_server_cmd_ctx *cmd,
-                            const struct smtp_address *rcpt_to);
+                            const struct smtp_address *rcpt_to,
+                            const struct smtp_params_rcpt *params);
 void smtp_server_recipient_ref(struct smtp_server_recipient *rcpt);
 bool smtp_server_recipient_unref(struct smtp_server_recipient **_rcpt);
 void smtp_server_recipient_destroy(struct smtp_server_recipient **_rcpt);
index 53b393868c7f4e4955cb0c59debdb4aff037b347..62eb56d6b4b1ed1a75da6064c634ef906966867e 100644 (file)
@@ -12,7 +12,8 @@ smtp_server_recipient_call_hooks(struct smtp_server_recipient **_rcpt,
 
 struct smtp_server_recipient *
 smtp_server_recipient_create(struct smtp_server_cmd_ctx *cmd,
-                            const struct smtp_address *rcpt_to)
+                            const struct smtp_address *rcpt_to,
+                            const struct smtp_params_rcpt *params)
 {
        struct smtp_server_recipient_private *prcpt;
        pool_t pool;
@@ -24,6 +25,7 @@ smtp_server_recipient_create(struct smtp_server_cmd_ctx *cmd,
        prcpt->rcpt.conn = cmd->conn;
        prcpt->rcpt.cmd = cmd;
        prcpt->rcpt.path = smtp_address_clone(pool, rcpt_to);
+       smtp_params_rcpt_copy(pool, &prcpt->rcpt.params, params);
 
        return &prcpt->rcpt;
 }