]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: Start using the new lib-smtp/server recipient pool.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 7 Oct 2018 20:32:38 +0000 (22:32 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:41:01 +0000 (15:41 +0200)
src/lmtp/lmtp-common.h
src/lmtp/lmtp-local.c
src/lmtp/lmtp-proxy.c

index d81f3dc12114cb1748a81b44b65b7e4d8461bf26..92adcdf6ffc3e62a49f9d67ca5e9f4f63349e376 100644 (file)
@@ -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;
 };
 
index 27168ffc7d1d2da32964637187c0f8d534573512..29d671506295251b6b31397a2be7435734638869 100644 (file)
@@ -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);
index 6550db1e481c0cb1f3d5398bec8c16e86d497406..505f17981d3787d5d1f18dea80bb7859cfb936b6 100644 (file)
@@ -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);