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

openSUSE Build Service is sponsored by