File 0506-ssl-Fix-ssl-peername-1-DTLS-client-sockets.patch of Package erlang
From 1ed6a1e19ab637def97118f0652a09f0e35dbede Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Dimitrov?= <peterdmv@erlang.org>
Date: Mon, 5 Oct 2020 17:03:36 +0200
Subject: [PATCH] ssl: Fix ssl:peername/1 (DTLS client sockets)
---
lib/ssl/src/dtls_socket.erl | 10 ++++++--
lib/ssl/src/ssl_connection.erl | 4 ++--
lib/ssl/test/ssl_api_SUITE.erl | 43 ++++++++++++++++++++++++++++++++++
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl
index 5fe4311af1..8019279e51 100644
--- a/lib/ssl/src/dtls_socket.erl
+++ b/lib/ssl/src/dtls_socket.erl
@@ -111,10 +111,11 @@ close(gen_udp, {_Client, _Socket}) ->
close(Transport, {_Client, Socket}) ->
Transport:close(Socket).
-socket(Pids, gen_udp = Transport, {{_, _}, Socket}, ConnectionCb) ->
+socket(Pids, gen_udp = Transport,
+ PeerAndSock = {{_Host, _Port}, _Socket}, ConnectionCb) ->
#sslsocket{pid = Pids,
%% "The name "fd" is keept for backwards compatibility
- fd = {Transport, Socket, ConnectionCb}};
+ fd = {Transport, PeerAndSock, ConnectionCb}};
socket(Pids, Transport, Socket, ConnectionCb) ->
#sslsocket{pid = Pids,
%% "The name "fd" is keept for backwards compatibility
@@ -179,14 +180,19 @@ getstat(gen_udp, Pid, Options) when is_pid(Pid) ->
dtls_packet_demux:getstat(Pid, Options);
getstat(gen_udp, {_,{_, Socket}}, Options) ->
inet:getstat(Socket, Options);
+getstat(gen_udp, {_, Socket}, Options) ->
+ inet:getstat(Socket, Options);
getstat(gen_udp, Socket, Options) ->
inet:getstat(Socket, Options);
getstat(Transport, Socket, Options) ->
Transport:getstat(Socket, Options).
+
peername(_, undefined) ->
{error, enotconn};
peername(gen_udp, {_, {Client, _Socket}}) ->
{ok, Client};
+peername(gen_udp, {Client, _Socket}) ->
+ {ok, Client};
peername(Transport, Socket) ->
Transport:peername(Socket).
sockname(gen_udp, {_, {_,Socket}}) ->
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index a854f50ee9..fa3e3ad9d8 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -193,10 +193,10 @@ socket_control(tls_connection = Connection, Socket, [Pid|_] = Pids, Transport, T
{error, Reason} ->
{error, Reason}
end;
-socket_control(dtls_connection = Connection, {_, Socket}, [Pid|_] = Pids, Transport, Trackers) ->
+socket_control(dtls_connection = Connection, {PeerAddrPort, Socket}, [Pid|_] = Pids, Transport, Trackers) ->
case Transport:controlling_process(Socket, Pid) of
ok ->
- {ok, Connection:socket(Pids, Transport, Socket, Trackers)};
+ {ok, Connection:socket(Pids, Transport, {PeerAddrPort, Socket}, Trackers)};
{error, Reason} ->
{error, Reason}
end.
diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl
index 877458e776..b06a096744 100644
--- a/lib/ssl/test/ssl_api_SUITE.erl
+++ b/lib/ssl/test/ssl_api_SUITE.erl
@@ -84,6 +84,7 @@ gen_api_tests() ->
hibernate,
hibernate_right_away,
listen_socket,
+ peername,
recv_active,
recv_active_once,
recv_active_n,
@@ -854,7 +855,44 @@ listen_socket(Config) ->
ok = ssl:close(ListenSocket).
%%--------------------------------------------------------------------
+peername() ->
+ [{doc,"Test API function peername/1"}].
+peername(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()},
+ {options, ServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+ {Client, CSocket} = ssl_test_lib:start_client(
+ [return_socket,
+ {node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {options, ClientOpts}]),
+
+ ct:log("Testcase ~p, Client ~p Server ~p ~n",
+ [self(), Client, Server]),
+
+ Server ! get_socket,
+ SSocket =
+ receive
+ {Server, {socket, Socket}} ->
+ Socket
+ end,
+
+ {ok, ServerPeer} = ssl:peername(SSocket),
+ ct:log("Server's peer: ~p~n", [ServerPeer]),
+ {ok, ClientPeer} = ssl:peername(CSocket),
+ ct:log("Client's peer: ~p~n", [ClientPeer]),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
--
2.26.2