File 0987-Correct-sockname-handling-for-DTLS.patch of Package erlang
From 5e4627a4c34c834b7a766bfeccca16f6f71ade61 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Fri, 15 Aug 2025 09:46:59 +0200
Subject: [PATCH] Correct sockname handling for DTLS
Closes #10097
---
lib/ssl/src/dtls_socket.erl | 4 ++-
lib/ssl/test/dtls_api_SUITE.erl | 45 ++++++++++++++++++++++++++++++---
2 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl
index 7a3a054357..4cb9141bf2 100644
--- a/lib/ssl/src/dtls_socket.erl
+++ b/lib/ssl/src/dtls_socket.erl
@@ -215,7 +215,9 @@ peername(gen_udp, {Client, _Socket}) ->
{ok, Client};
peername(Transport, Socket) ->
Transport:peername(Socket).
-sockname(gen_udp, {_, {_,Socket}}) ->
+sockname(gen_udp, {Listener, {_Client, Socket}}) when is_pid(Listener) ->
+ inet:sockname(Socket);
+sockname(gen_udp, {_Client, Socket}) ->
inet:sockname(Socket);
sockname(gen_udp, Socket) ->
inet:sockname(Socket);
diff --git a/lib/ssl/test/dtls_api_SUITE.erl b/lib/ssl/test/dtls_api_SUITE.erl
index 7b54c7f920..a6ca7a5eb4 100644
--- a/lib/ssl/test/dtls_api_SUITE.erl
+++ b/lib/ssl/test/dtls_api_SUITE.erl
@@ -35,7 +35,8 @@
%% Testcases
-export([
- replay_window/0, replay_window/1,
+ replay_window/0,
+ replay_window/1,
dtls_listen_owner_dies/0,
dtls_listen_owner_dies/1,
dtls_listen_close/0,
@@ -56,8 +57,11 @@
dtls_listen_two_sockets_5/1,
dtls_listen_two_sockets_6/0,
dtls_listen_two_sockets_6/1,
- client_restarts/0, client_restarts/1,
- client_restarts_multiple_acceptors/1
+ client_restarts/0,
+ client_restarts/1,
+ client_restarts_multiple_acceptors/1,
+ sockname/0,
+ sockname/1
]).
-include_lib("ssl/src/ssl_internal.hrl").
@@ -93,7 +97,8 @@ api_tests() ->
dtls_listen_two_sockets_5,
dtls_listen_two_sockets_6,
client_restarts,
- client_restarts_multiple_acceptors
+ client_restarts_multiple_acceptors,
+ sockname
].
init_per_suite(Config0) ->
@@ -568,6 +573,38 @@ client_restarts_multiple_acceptors(Config) ->
ssl_test_lib:close(Client0),
ok.
+sockname() ->
+ [{doc,"Test API function sockname/1"}].
+sockname(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl, sockname, []}},
+ {options, ServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl, sockname, []}},
+ {options, [{port, 0} | ClientOpts]}]),
+
+ ClientPort = ssl_test_lib:inet_port(Client),
+
+ NoBind = {0,0,0,0}, %% Normal UDP socket will not have an IP-address bound to it
+
+ ServerMsg = {ok, {NoBind, Port}},
+ ClientMsg = {ok, {NoBind, ClientPort}},
+
+ ?CT_LOG("Client ~p Server ~p ~n", [Client, Server]),
+
+ ssl_test_lib:check_result(Server, ServerMsg, Client, ClientMsg),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+
%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
--
2.43.0