From: Stephan Bosch Date: Thu, 14 Feb 2019 00:05:57 +0000 (+0100) Subject: lib-smtp: smtp-server - Provide RCPT parameters as parameter to smtp_server_recipient... X-Git-Tag: 2.3.9~709 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb951734ea2a403c1f11984c7ae36cea456bb93a;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-server - Provide RCPT parameters as parameter to smtp_server_recipient_create(). Needed for event API, but also fixes a memory leak occurring upon parameter parse error. --- diff --git a/src/lib-smtp/smtp-server-cmd-rcpt.c b/src/lib-smtp/smtp-server-cmd-rcpt.c index a40ce8202a..65186deff0 100644 --- a/src/lib-smtp/smtp-server-cmd-rcpt.c +++ b/src/lib-smtp/smtp-server-cmd-rcpt.c @@ -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, diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index 7884520ccb..c650205ec7 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -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); diff --git a/src/lib-smtp/smtp-server-recipient.c b/src/lib-smtp/smtp-server-recipient.c index 53b393868c..62eb56d6b4 100644 --- a/src/lib-smtp/smtp-server-recipient.c +++ b/src/lib-smtp/smtp-server-recipient.c @@ -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; }