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

openSUSE Build Service is sponsored by