From: Stephan Bosch Date: Sun, 7 Oct 2018 20:32:38 +0000 (+0200) Subject: lmtp: Start using the new lib-smtp/server recipient pool. X-Git-Tag: 2.3.9~1214 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=078a025291701f0993732b1cc0de548c82736d80;p=thirdparty%2Fdovecot%2Fcore.git lmtp: Start using the new lib-smtp/server recipient pool. --- diff --git a/src/lmtp/lmtp-common.h b/src/lmtp/lmtp-common.h index d81f3dc121..92adcdf6ff 100644 --- a/src/lmtp/lmtp-common.h +++ b/src/lmtp/lmtp-common.h @@ -14,11 +14,11 @@ enum lmtp_recipient_type { struct lmtp_recipient { struct client *client; + struct smtp_server_recipient *rcpt; enum lmtp_recipient_type type; struct smtp_address *path; struct smtp_server_cmd_ctx *rcpt_cmd; - struct smtp_server_recipient *rcpt; unsigned int index; }; diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 27168ffc7d..29d6715062 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -55,9 +55,6 @@ struct lmtp_local { struct mail_user *rcpt_user; }; -static void -lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt); - /* * LMTP local */ @@ -77,15 +74,11 @@ lmtp_local_init(struct client *client) void lmtp_local_deinit(struct lmtp_local **_local) { struct lmtp_local *local = *_local; - struct lmtp_local_recipient *const *llrcptp; *_local = NULL; - if (array_is_created(&local->rcpt_to)) { - array_foreach_modifiable(&local->rcpt_to, llrcptp) - lmtp_local_rcpt_deinit(*llrcptp); + if (array_is_created(&local->rcpt_to)) array_free(&local->rcpt_to); - } if (local->raw_mail != NULL) { struct mailbox_transaction_context *raw_trans = @@ -120,16 +113,13 @@ lmtp_local_rcpt_anvil_disconnect(struct lmtp_local_recipient *llrcpt) } static void -lmtp_local_rcpt_deinit(struct lmtp_local_recipient *llrcpt) +lmtp_local_rcpt_destroy(struct smtp_server_recipient *rcpt ATTR_UNUSED, + struct lmtp_local_recipient *llrcpt) { if (llrcpt->anvil_query != NULL) anvil_client_query_abort(anvil, &llrcpt->anvil_query); lmtp_local_rcpt_anvil_disconnect(llrcpt); mail_storage_service_user_unref(&llrcpt->service_user); - - i_free(llrcpt->session_id); - i_free(llrcpt->detail); - i_free(llrcpt); } static void @@ -142,8 +132,6 @@ lmtp_local_rcpt_reply_overquota(struct lmtp_local_recipient *llrcpt, struct lda_settings *lda_set = mail_storage_service_user_get_set(llrcpt->service_user)[2]; - i_assert(rcpt_idx == 0 || llrcpt->rcpt.rcpt_cmd == NULL); - if (lda_set->quota_full_tempfail) { smtp_server_reply_index(cmd, rcpt_idx, 452, "4.2.2", "<%s> %s", smtp_address_encode(address), error); @@ -180,15 +168,6 @@ lmtp_local_rcpt_fail_all(struct lmtp_local *local, * RCPT command */ -static void -lmtp_local_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, - struct lmtp_local_recipient *llrcpt) -{ - /* failed in RCPT command; clean up early */ - lmtp_local_rcpt_deinit(llrcpt); - return; -} - static int lmtp_local_rcpt_check_quota(struct lmtp_local_recipient *llrcpt) { @@ -258,11 +237,6 @@ lmtp_local_rcpt_approved(struct smtp_server_recipient *rcpt, { struct client *client = llrcpt->rcpt.client; - smtp_server_command_remove_hook( - llrcpt->rcpt.rcpt_cmd->cmd, - SMTP_SERVER_COMMAND_HOOK_DESTROY, - lmtp_local_rcpt_cmd_destroy); - lmtp_recipient_finish(&llrcpt->rcpt); /* resolve duplicate recipient */ @@ -281,10 +255,8 @@ lmtp_local_rcpt_anvil_finish(struct lmtp_local_recipient *llrcpt) struct smtp_server_cmd_ctx *cmd = llrcpt->rcpt.rcpt_cmd; int ret; - if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0) { - lmtp_local_rcpt_deinit(llrcpt); + if ((ret = lmtp_local_rcpt_check_quota(llrcpt)) < 0) return FALSE; - } smtp_server_reply(cmd, 250, "2.1.5", "OK"); return TRUE; @@ -380,17 +352,17 @@ int lmtp_local_rcpt(struct client *client, if (client->local == NULL) client->local = lmtp_local_init(client); - llrcpt = i_new(struct lmtp_local_recipient, 1); + llrcpt = p_new(rcpt->pool, struct lmtp_local_recipient, 1); lmtp_recipient_init(&llrcpt->rcpt, client, LMTP_RECIPIENT_TYPE_LOCAL, cmd, rcpt); - llrcpt->detail = i_strdup(detail); + llrcpt->detail = p_strdup(rcpt->pool, detail); llrcpt->service_user = service_user; - llrcpt->session_id = i_strdup(session_id); - - smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY, - lmtp_local_rcpt_cmd_destroy, llrcpt); + llrcpt->session_id = p_strdup(rcpt->pool, session_id); + smtp_server_recipient_add_hook( + rcpt, SMTP_SERVER_RECIPIENT_HOOK_DESTROY, + lmtp_local_rcpt_destroy, llrcpt); smtp_server_recipient_add_hook( rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED, lmtp_local_rcpt_approved, llrcpt); diff --git a/src/lmtp/lmtp-proxy.c b/src/lmtp/lmtp-proxy.c index 6550db1e48..505f17981d 100644 --- a/src/lmtp/lmtp-proxy.c +++ b/src/lmtp/lmtp-proxy.c @@ -135,12 +135,6 @@ lmtp_proxy_init(struct client *client, return proxy; } -static void -lmtp_proxy_recipient_deinit(struct lmtp_proxy_recipient *lprcpt) -{ - i_free(lprcpt); -} - static void lmtp_proxy_connection_deinit(struct lmtp_proxy_connection *conn) { @@ -155,14 +149,10 @@ lmtp_proxy_connection_deinit(struct lmtp_proxy_connection *conn) void lmtp_proxy_deinit(struct lmtp_proxy **_proxy) { struct lmtp_proxy *proxy = *_proxy; - struct lmtp_proxy_recipient *const *lprcpts; struct lmtp_proxy_connection *const *conns; *_proxy = NULL; - array_foreach(&proxy->rcpt_to, lprcpts) - lmtp_proxy_recipient_deinit(*lprcpts); - array_foreach(&proxy->connections, conns) lmtp_proxy_connection_deinit(*conns); @@ -436,29 +426,15 @@ lmtp_proxy_is_ourself(const struct client *client, return TRUE; } -static void -lmtp_proxy_rcpt_cmd_destroy(struct smtp_server_cmd_ctx *cmd ATTR_UNUSED, - struct lmtp_proxy_recipient *lprcpt) -{ - lmtp_proxy_recipient_deinit(lprcpt); -} - static void lmtp_proxy_rcpt_approved(struct smtp_server_recipient *rcpt ATTR_UNUSED, struct lmtp_proxy_recipient *lprcpt) { struct client *client = lprcpt->rcpt.client; - if (lprcpt->rcpt.rcpt_cmd != NULL) { - smtp_server_command_remove_hook( - lprcpt->rcpt.rcpt_cmd->cmd, - SMTP_SERVER_COMMAND_HOOK_DESTROY, - lmtp_proxy_rcpt_cmd_destroy); - } - lmtp_recipient_finish(&lprcpt->rcpt); - /* add to local recipients */ + /* add to proxy recipients */ array_append(&client->proxy->rcpt_to, &lprcpt, 1); } @@ -590,15 +566,12 @@ int lmtp_proxy_rcpt(struct client *client, conn = lmtp_proxy_get_connection(client->proxy, &set); pool_unref(&auth_pool); - lprcpt = i_new(struct lmtp_proxy_recipient, 1); + lprcpt = p_new(rcpt->pool, struct lmtp_proxy_recipient, 1); lmtp_recipient_init(&lprcpt->rcpt, client, LMTP_RECIPIENT_TYPE_PROXY, cmd, rcpt); lprcpt->rcpt.path = smtp_address_clone(rcpt->pool, address); lprcpt->conn = conn; - smtp_server_command_add_hook(cmd->cmd, SMTP_SERVER_COMMAND_HOOK_DESTROY, - lmtp_proxy_rcpt_cmd_destroy, lprcpt); - smtp_server_recipient_add_hook( rcpt, SMTP_SERVER_RECIPIENT_HOOK_APPROVED, lmtp_proxy_rcpt_approved, lprcpt);