File 0549-ssl-Do-not-send-and-receive-from-same-process.patch of Package erlang
From dbf7f79a05784f1905012b8d5a3f868bc4e20167 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Thu, 10 Oct 2019 08:29:53 +0200
Subject: [PATCH] ssl: Do not send and receive from same process
Rule out possible busy port deadlock
Even though ssl application uses different processes for
sending and receiving. Similar conditions could be caused
by having same user process calling ssl:send and receiving
the data from the ssl socket.
---
lib/ssl/test/ssl_packet_SUITE.erl | 48 +++++++++++++++++++++-----------------
lib/ssl/test/ssl_payload_SUITE.erl | 8 +++----
2 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl
index 6d26b2df33..1ee9d4b21f 100644
--- a/lib/ssl/test/ssl_packet_SUITE.erl
+++ b/lib/ssl/test/ssl_packet_SUITE.erl
@@ -860,11 +860,11 @@ server_http_decode(Socket, HttpResponse) ->
Other4 -> exit({?LINE, Other4})
end,
assert_packet_opt(Socket, http),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
ok.
client_http_decode(Socket, HttpRequest) ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, "OK"}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -922,7 +922,7 @@ packet_http_decode_list(Config) when is_list(Config) ->
client_http_decode_list(Socket, HttpRequest) ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, "OK"}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -1001,13 +1001,13 @@ server_http_bin_decode(Socket, HttpResponse, Count) when Count > 0 ->
Other4 -> exit({?LINE, Other4})
end,
assert_packet_opt(Socket, http_bin),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
server_http_bin_decode(Socket, HttpResponse, Count - 1);
server_http_bin_decode(_, _, _) ->
ok.
client_http_bin_decode(Socket, HttpRequest, Count) when Count > 0 ->
- ok = ssl:send(Socket, HttpRequest),
+ spawn(fun() -> ssl:send(Socket, HttpRequest) end),
receive
{ssl, Socket, {http_response, {1,1}, 200, <<"OK">>}} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -1085,7 +1085,7 @@ server_http_decode_error(Socket, HttpResponse) ->
{ok, http_eoh} = ssl:recv(Socket, 0),
assert_packet_opt(Socket, http),
- ok = ssl:send(Socket, HttpResponse),
+ spawn(fun() -> ssl:send(Socket, HttpResponse) end),
ok.
%%--------------------------------------------------------------------
packet_httph_active() ->
@@ -2164,7 +2164,8 @@ server_packet_decode(Socket, Packet) ->
{ssl, Socket, Packet} -> ok;
Other2 -> exit({?LINE, Other2})
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_packet_decode(Socket, Packet) when is_binary(Packet)->
<<P1:10/binary, P2/binary>> = Packet,
@@ -2174,13 +2175,13 @@ client_packet_decode(Socket, [Head | Tail] = Packet) ->
client_packet_decode(Socket, P1, P2, Packet) ->
ct:log("Packet: ~p ~n", [Packet]),
- ok = ssl:send(Socket, P1),
- ok = ssl:send(Socket, P2),
+ spawn(fun() -> ssl:send(Socket, P1) end),
+ spawn(fun() -> ssl:send(Socket, P2) end),
receive
{ssl, Socket, Packet} -> ok;
Other1 -> exit({?LINE, Other1})
end,
- ok = ssl:send(Socket, Packet),
+ spawn(fun() -> ssl:send(Socket, Packet) end),
receive
{ssl, Socket, Packet} -> ok;
Other2 -> exit({?LINE, Other2})
@@ -2193,10 +2194,11 @@ server_header_decode_active(Socket, Packet, Result) ->
{ssl, Socket, Other1} ->
check_header_result(Result, Other1)
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_header_decode_active(Socket, Packet, Result) ->
- ok = ssl:send(Socket, Packet),
+ spawn(fun() -> ssl:send(Socket, Packet) end),
receive
{ssl, Socket, Result} ->
ok;
@@ -2211,11 +2213,11 @@ server_header_decode_passive(Socket, Packet, Result) ->
{ok, Other} ->
check_header_result(Result, Other)
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_header_decode_passive(Socket, Packet, Result) ->
- ok = ssl:send(Socket, Packet),
-
+ spawn(fun() -> ssl:send(Socket, Packet) end),
case ssl:recv(Socket, 0) of
{ok, Result} ->
ok;
@@ -2253,7 +2255,8 @@ server_line_packet_decode(Socket, L1, L2, Packet) ->
{ssl, Socket, L2} -> ok;
Other2 -> exit({?LINE, Other2})
end,
- ok = ssl:send(Socket, Packet).
+ spawn(fun() -> ssl:send(Socket, Packet) end),
+ ok.
client_line_packet_decode(Socket, Packet) when is_binary(Packet)->
<<P1:10/binary, P2/binary>> = Packet,
@@ -2264,8 +2267,8 @@ client_line_packet_decode(Socket, [Head | Tail] = Packet) ->
client_line_packet_decode(Socket, [Head], Tail, L1 ++ "\n", L2 ++ "\n").
client_line_packet_decode(Socket, P1, P2, L1, L2) ->
- ok = ssl:send(Socket, P1),
- ok = ssl:send(Socket, P2),
+ spawn(fun() -> ssl:send(Socket, P1) end),
+ spawn(fun() -> ssl:send(Socket, P2) end),
receive
{ssl, Socket, L1} -> ok;
Other1 -> exit({?LINE, Other1})
@@ -2305,11 +2308,11 @@ client_reject_packet_opt(Config, PacketOpt) ->
send_switch_packet(SslSocket, Data, NextPacket) ->
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
receive
{ssl, SslSocket, "Hello World"} ->
ssl:setopts(SslSocket, [{packet, NextPacket}]),
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
receive
{ssl, SslSocket, "Hello World"} ->
ok
@@ -2318,10 +2321,11 @@ send_switch_packet(SslSocket, Data, NextPacket) ->
recv_switch_packet(SslSocket, Data, NextPacket) ->
receive
{ssl, SslSocket, "Hello World"} ->
- ssl:send(SslSocket, Data),
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
ssl:setopts(SslSocket, [{packet, NextPacket}]),
receive
{ssl, SslSocket, "Hello World"} ->
- ssl:send(SslSocket, Data)
+ spawn(fun() -> ssl:send(SslSocket, Data) end),
+ ok
end
end.
diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl
index 2d0ffd03d7..91043408b7 100644
--- a/lib/ssl/test/ssl_payload_SUITE.erl
+++ b/lib/ssl/test/ssl_payload_SUITE.erl
@@ -776,7 +776,7 @@ echo_recv(_Socket, 0) ->
ok;
echo_recv(Socket, Size) ->
{ok, Data} = ssl:recv(Socket, 0),
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_recv(Socket, Size - byte_size(Data)).
@@ -785,7 +785,7 @@ echo_recv_chunk(_Socket, _, 0) ->
ok;
echo_recv_chunk(Socket, ChunkSize, Size) ->
{ok, Data} = ssl:recv(Socket, ChunkSize),
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_recv_chunk(Socket, ChunkSize, Size - ChunkSize).
@@ -795,7 +795,7 @@ echo_active_once(_Socket, 0) ->
echo_active_once(Socket, Size) ->
receive
{ssl, Socket, Data} ->
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
NewSize = Size - byte_size(Data),
ssl:setopts(Socket, [{active, once}]),
echo_active_once(Socket, NewSize)
@@ -807,7 +807,7 @@ echo_active(_Socket, 0) ->
echo_active(Socket, Size) ->
receive
{ssl, Socket, Data} ->
- ok = ssl:send(Socket, Data),
+ spawn(fun() -> ssl:send(Socket, Data) end),
echo_active(Socket, Size - byte_size(Data))
end.
--
2.16.4