File 0973-ssl-Remove-is_port-guards-for-sockets.patch of Package erlang
From eb288918354de215c2c1b3f38feedb763cd97447 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Tue, 26 Apr 2022 11:39:05 +0200
Subject: [PATCH] ssl: Remove is_port guards for sockets
Sockets may have other types then port, remove these checks as it
violates socket abstraction and breaks the code for gen_tcp sockets
with new inet_backend.
Closes #5930
---
lib/ssl/src/ssl.erl | 48 +++++++++++++++------------------
lib/ssl/test/dtls_api_SUITE.erl | 2 +-
lib/ssl/test/tls_api_SUITE.erl | 14 +++++-----
3 files changed, 28 insertions(+), 36 deletions(-)
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index e61ffa6cc9..2b88568927 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -849,7 +849,7 @@ send(#sslsocket{pid = {dtls,_}}, _) ->
{error,enotconn}; %% Emulate connection behaviour
send(#sslsocket{pid = {ListenSocket, #config{transport_info = Info}}}, Data) ->
Transport = element(1, Info),
- Transport:send(ListenSocket, Data). %% {error,enotconn}
+ tls_socket:send(Transport, ListenSocket, Data). %% {error,enotconn}
%%--------------------------------------------------------------------
%%
@@ -877,7 +877,7 @@ recv(#sslsocket{pid = [Pid|_]}, Length, Timeout) when is_pid(Pid),
recv(#sslsocket{pid = {dtls,_}}, _, _) ->
{error,enotconn};
recv(#sslsocket{pid = {Listen,
- #config{transport_info = Info}}},_,_) when is_port(Listen)->
+ #config{transport_info = Info}}},_,_) ->
Transport = element(1, Info),
Transport:recv(Listen, 0). %% {error,enotconn}
@@ -897,12 +897,10 @@ controlling_process(#sslsocket{pid = {dtls, _}},
ok; %% Meaningless but let it be allowed to conform with TLS
controlling_process(#sslsocket{pid = {Listen,
#config{transport_info = {Transport,_,_,_,_}}}},
- NewOwner) when is_port(Listen),
- is_pid(NewOwner) ->
- %% Meaningless but let it be allowed to conform with normal sockets
+ NewOwner) when is_pid(NewOwner) ->
+ %% Meaningless but let it be allowed to conform with normal sockets
Transport:controlling_process(Listen, NewOwner).
-
%%--------------------------------------------------------------------
-spec connection_information(SslSocket) -> {ok, Result} | {error, reason()} when
SslSocket :: sslsocket(),
@@ -917,11 +915,8 @@ connection_information(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) ->
Error ->
Error
end;
-connection_information(#sslsocket{pid = {Listen, _}}) when is_port(Listen) ->
- {error, enotconn};
-connection_information(#sslsocket{pid = {dtls,_}}) ->
- {error,enotconn}.
-
+connection_information(#sslsocket{pid = {_Listen, #config{}}}) ->
+ {error, enotconn}.
%%--------------------------------------------------------------------
-spec connection_information(SslSocket, Items) -> {ok, Result} | {error, reason()} when
SslSocket :: sslsocket(),
@@ -975,7 +970,7 @@ peercert(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) ->
end;
peercert(#sslsocket{pid = {dtls, _}}) ->
{error, enotconn};
-peercert(#sslsocket{pid = {Listen, _}}) when is_port(Listen) ->
+peercert(#sslsocket{pid = {_Listen, #config{}}}) ->
{error, enotconn}.
%%--------------------------------------------------------------------
@@ -1247,12 +1242,14 @@ getstat(Socket) ->
%%
%% Description: Get one or more statistic options for a socket.
%%--------------------------------------------------------------------
-getstat(#sslsocket{pid = {dtls, #config{transport_info = {Transport, _, _, _, _},
+getstat(#sslsocket{pid = {dtls, #config{transport_info = Info,
dtls_handler = {Listener, _}}}},
Options) when is_list(Options) ->
+ Transport = element(1, Info),
dtls_socket:getstat(Transport, Listener, Options);
-getstat(#sslsocket{pid = {Listen, #config{transport_info = {Transport, _, _, _, _}}}},
- Options) when is_port(Listen), is_list(Options) ->
+getstat(#sslsocket{pid = {Listen, #config{transport_info = Info}}},
+ Options) when is_list(Options) ->
+ Transport = element(1, Info),
tls_socket:getstat(Transport, Listen, Options);
getstat(#sslsocket{pid = [Pid|_], fd = {Transport, Socket, _, _}},
Options) when is_pid(Pid), is_list(Options) ->
@@ -1268,12 +1265,11 @@ getstat(#sslsocket{pid = [Pid|_], fd = {Transport, Socket, _}},
%%
%% Description: Same as gen_tcp:shutdown/2
%%--------------------------------------------------------------------
-shutdown(#sslsocket{pid = {Listen, #config{transport_info = Info}}},
- How) when is_port(Listen) ->
- Transport = element(1, Info),
- Transport:shutdown(Listen, How);
-shutdown(#sslsocket{pid = {dtls,_}},_) ->
+shutdown(#sslsocket{pid = {dtls, #config{}}},_) ->
{error, enotconn};
+shutdown(#sslsocket{pid = {Listen, #config{transport_info = Info}}}, How) ->
+ Transport = element(1, Info),
+ Transport:shutdown(Listen, How);
shutdown(#sslsocket{pid = [Pid|_]}, How) when is_pid(Pid) ->
ssl_gen_statem:shutdown(Pid, How).
@@ -1286,10 +1282,11 @@ shutdown(#sslsocket{pid = [Pid|_]}, How) when is_pid(Pid) ->
%%
%% Description: Same as inet:sockname/1
%%--------------------------------------------------------------------
-sockname(#sslsocket{pid = {Listen, #config{transport_info = {Transport,_,_,_,_}}}}) when is_port(Listen) ->
- tls_socket:sockname(Transport, Listen);
sockname(#sslsocket{pid = {dtls, #config{dtls_handler = {Pid, _}}}}) ->
dtls_packet_demux:sockname(Pid);
+sockname(#sslsocket{pid = {Listen, #config{transport_info = Info}}}) ->
+ Transport = element(1, Info),
+ tls_socket:sockname(Transport, Listen);
sockname(#sslsocket{pid = [Pid|_], fd = {Transport, Socket,_}}) when is_pid(Pid) ->
dtls_socket:sockname(Transport, Socket);
sockname(#sslsocket{pid = [Pid| _], fd = {Transport, Socket,_,_}}) when is_pid(Pid) ->
@@ -1348,10 +1345,9 @@ renegotiate(#sslsocket{pid = [Pid |_]}) when is_pid(Pid) ->
tls_dtls_connection:renegotiation(Pid);
renegotiate(#sslsocket{pid = {dtls,_}}) ->
{error, enotconn};
-renegotiate(#sslsocket{pid = {Listen,_}}) when is_port(Listen) ->
+renegotiate(#sslsocket{pid = {_Listen, #config{}}}) ->
{error, enotconn}.
-
%%---------------------------------------------------------------
-spec update_keys(SslSocket, Type) -> ok | {error, reason()} when
SslSocket :: sslsocket(),
@@ -1387,9 +1383,7 @@ update_keys(_, Type) ->
prf(#sslsocket{pid = [Pid|_]},
Secret, Label, Seed, WantedLength) when is_pid(Pid) ->
tls_dtls_connection:prf(Pid, Secret, Label, Seed, WantedLength);
-prf(#sslsocket{pid = {dtls,_}}, _,_,_,_) ->
- {error, enotconn};
-prf(#sslsocket{pid = {Listen,_}}, _,_,_,_) when is_port(Listen) ->
+prf(#sslsocket{pid = {_Listen, #config{}}}, _,_,_,_) ->
{error, enotconn}.
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/tls_api_SUITE.erl b/lib/ssl/test/tls_api_SUITE.erl
index 9bc1529a4a..4dd32ab0dc 100644
--- a/lib/ssl/test/tls_api_SUITE.erl
+++ b/lib/ssl/test/tls_api_SUITE.erl
@@ -1223,13 +1221,13 @@ tls_downgrade_result(Socket, Pid) ->
end.
tls_shutdown_result(Socket, server) ->
- ssl:send(Socket, "Hej"),
+ ok = ssl:send(Socket, "Hej"),
ok = ssl:shutdown(Socket, write),
{ok, "Hej hopp"} = ssl:recv(Socket, 8),
ok;
tls_shutdown_result(Socket, client) ->
- ssl:send(Socket, "Hej hopp"),
+ ok = ssl:send(Socket, "Hej hopp"),
ok = ssl:shutdown(Socket, write),
{ok, "Hej"} = ssl:recv(Socket, 3),
ok.
--
2.34.1