]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp, global: smtp_server_connection_create*() - Add local_ip and local_port...
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 2 Feb 2026 11:20:54 +0000 (13:20 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 6 Feb 2026 07:58:43 +0000 (07:58 +0000)
src/lib-smtp/fuzz-smtp-server.c
src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server.h
src/lib-smtp/test-smtp-payload.c
src/lib-smtp/test-smtp-server-errors.c
src/lmtp/lmtp-client.c
src/submission-login/client.c
src/submission/submission-client.c

index fa86b7fee939304ef19b50db888cdc0165e5ffc0..0aadbbfc3c351cb3adbc029fd6f62e4aa7ddb998 100644 (file)
@@ -89,7 +89,7 @@ FUZZ_BEGIN_FD
        to = timeout_add_short(10, test_server_continue, &fuzz_ctx);
        smtp_server = smtp_server_init(&smtp_server_set);
 
-       conn = smtp_server_connection_create(smtp_server, fuzz_ctx.fd, fuzz_ctx.fd, NULL, 0,
+       conn = smtp_server_connection_create(smtp_server, fuzz_ctx.fd, fuzz_ctx.fd, NULL, 0, NULL, 0,
                                             FALSE, NULL, &server_callbacks, &fuzz_ctx);
        smtp_server_connection_start(conn);
 
index b00daf34faa125bcd1cd9900f9b189d52fcfee71..ed8e3a73cb02ba0b3f19d48e05d492f7416102c7 100644 (file)
@@ -1072,6 +1072,7 @@ static void smtp_server_connection_created(struct smtp_server_connection *conn)
 struct smtp_server_connection *
 smtp_server_connection_create(
        struct smtp_server *server, int fd_in, int fd_out,
+       const struct ip_addr *local_ip, in_port_t local_port,
        const struct ip_addr *remote_ip, in_port_t remote_port,
        bool ssl_start, const struct smtp_server_settings *set,
        const struct smtp_server_callbacks *callbacks, void *context)
@@ -1085,6 +1086,9 @@ smtp_server_connection_create(
        conn->conn.event_parent = conn_event;
        connection_init_server_ip(server->conn_list, &conn->conn, NULL,
                                  fd_in, fd_out, remote_ip, remote_port);
+       if (local_ip != NULL && local_ip->family != 0)
+               conn->conn.local_ip = *local_ip;
+       conn->conn.local_port = local_port;
        conn->event = conn->conn.event;
        smtp_server_connection_update_event(conn);
        event_unref(&conn_event);
@@ -1102,6 +1106,7 @@ struct smtp_server_connection *
 smtp_server_connection_create_from_streams(
        struct smtp_server *server,
        struct istream *input, struct ostream *output,
+       const struct ip_addr *local_ip, in_port_t local_port,
        const struct ip_addr *remote_ip, in_port_t remote_port,
        const struct smtp_server_settings *set,
        const struct smtp_server_callbacks *callbacks, void *context)
@@ -1117,6 +1122,9 @@ smtp_server_connection_create_from_streams(
 
        conn = smtp_server_connection_alloc(server, set, fd_in, fd_out,
                                            callbacks, context);
+       if (local_ip != NULL && local_ip->family != 0)
+               conn->conn.local_ip = *local_ip;
+       conn->conn.local_port = local_port;
        if (remote_ip != NULL && remote_ip->family != 0)
                conn->conn.remote_ip = *remote_ip;
        if (remote_port != 0)
index 8e13dd719ac1f8b73ca1678fa8fe7f9053484f9d..dbd0f6e09b30d2104fc0b9d0cb2f7a8bc96daf97 100644 (file)
@@ -425,6 +425,7 @@ void smtp_server_switch_ioloop(struct smtp_server *server);
 struct smtp_server_connection *
 smtp_server_connection_create(
        struct smtp_server *server, int fd_in, int fd_out,
+       const struct ip_addr *local_ip, in_port_t local_port,
        const struct ip_addr *remote_ip, in_port_t remote_port, bool ssl_start,
        const struct smtp_server_settings *set,
        const struct smtp_server_callbacks *callbacks, void *context)
@@ -433,6 +434,7 @@ struct smtp_server_connection *
 smtp_server_connection_create_from_streams(
        struct smtp_server *server,
        struct istream *input, struct ostream *output,
+       const struct ip_addr *local_ip, in_port_t local_port,
        const struct ip_addr *remote_ip, in_port_t remote_port,
        const struct smtp_server_settings *set,
        const struct smtp_server_callbacks *callbacks, void *context)
index 5329331e598e7b2866da209e396b29fa2c381ef1..4979bb1a7ed6e60df2de7ce3f2168e6aaa5af7a4 100644 (file)
@@ -705,7 +705,7 @@ static void client_init(int fd)
        client->pool = pool;
 
        client->smtp_conn = smtp_server_connection_create(
-               smtp_server, fd, fd, NULL, 0,
+               smtp_server, fd, fd, NULL, 0, NULL, 0,
                (tset.ssl_mode == TEST_SSL_MODE_IMMEDIATE),
                NULL, &server_callbacks, client);
        smtp_server_connection_start(client->smtp_conn);
index 0fa90b818c92ef9565ebf4ec09cce20b3490969a..baa4c9f5a9611cab30d55ff62ad6b7ca8db84096 100644 (file)
@@ -3931,7 +3931,8 @@ static void server_connection_accept(void *context ATTR_UNUSED)
 
        if (server_io_buffer_size == 0) {
                conn = smtp_server_connection_create(
-                       smtp_server, fd, fd, NULL, 0, (test_ssl_host != NULL),
+                       smtp_server, fd, fd, NULL, 0, NULL, 0,
+                       (test_ssl_host != NULL),
                        NULL, &server_callbacks, sconn);
        } else {
                struct istream *input;
@@ -3942,7 +3943,7 @@ static void server_connection_accept(void *context ATTR_UNUSED)
                o_stream_set_no_error_handling(output, TRUE);
 
                conn = smtp_server_connection_create_from_streams(
-                       smtp_server, input, output, NULL, 0, NULL,
+                       smtp_server, input, output, NULL, 0, NULL, 0, NULL,
                        &server_callbacks, sconn);
 
                i_stream_unref(&input);
index 6003d5d5a4e64cef255f521dbcfa21467875a89d..1aae4b81e0c2d5dbd0cbcd310fe1de733559cf05 100644 (file)
@@ -213,7 +213,7 @@ struct client *client_create(int fd_in, int fd_out,
        }
 
        client->conn = smtp_server_connection_create(
-               lmtp_server, fd_in, fd_out,
+               lmtp_server, fd_in, fd_out, &conn->local_ip, conn->local_port,
                &conn->remote_ip, conn->remote_port, conn->ssl,
                &lmtp_set, &lmtp_callbacks, client);
        if (smtp_server_connection_is_trusted(client->conn)) {
index 52af9597044df1cde42b87950667d047ba51b0db..789dc5ded53c665fc8586564afadf2e0f3c1de26 100644 (file)
@@ -141,6 +141,7 @@ static int submission_client_create(struct client *client)
 
        subm_client->conn = smtp_server_connection_create_from_streams(
                smtp_server, client->input, client->output,
+               &client->real_local_ip, client->real_local_port,
                &client->real_remote_ip, client->real_remote_port,
                &smtp_set, &smtp_callbacks, subm_client);
        return 0;
index 4ca84ce61b06f79af6c7f1aa95ac4f83a4945ede..3e89f9464f67d7393372ad92be29131101ede5cf 100644 (file)
@@ -236,7 +236,8 @@ client_create(int fd_in, int fd_out, struct event *event,
        p_array_init(&client->module_contexts, client->pool, 5);
 
        conn = client->conn = smtp_server_connection_create(smtp_server,
-               fd_in, fd_out, user->conn.remote_ip, user->conn.remote_port,
+               fd_in, fd_out, user->conn.local_ip, user->conn.local_port,
+               user->conn.remote_ip, user->conn.remote_port,
                FALSE, &smtp_set, &smtp_callbacks, client);
        smtp_server_connection_set_proxy_data(conn, proxy_data);
        smtp_server_connection_login(conn, client->user->username, helo,