File 0205-inets-Eliminate-race-condition.patch of Package erlang

From 6eba2a32f2585bfd1d94fa1066167901213d0408 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Tue, 14 Nov 2017 08:53:01 +0100
Subject: [PATCH] inets: Eliminate race condition

Only run test case for http as the socket manipulation done by the test case
requires much more manipulation to work for https. However, that this test case
started failing constantly instead of sporadically is proof that this change
is a good thing.
---
 lib/inets/src/http_client/httpc_handler.erl | 16 ++++++++++------
 lib/inets/src/http_client/httpc_manager.erl |  4 ++--
 lib/inets/test/httpc_SUITE.erl              |  3 +--
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 6907bf5262..1482f4f922 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -109,7 +109,7 @@ start_link(Parent, Request, Options, ProfileName) ->
 %% to be called by the httpc manager process.
 %%--------------------------------------------------------------------
 send(Request, Pid) ->
-    call(Request, Pid, 5000).
+    call(Request, Pid).
 
 
 %%--------------------------------------------------------------------
@@ -712,12 +712,16 @@ do_handle_info({'EXIT', _, _}, State = #state{request = undefined}) ->
 do_handle_info({'EXIT', _, _}, State) ->
     {noreply, State#state{status = close}}.
     
-
 call(Msg, Pid) ->
-    call(Msg, Pid, infinity).
-
-call(Msg, Pid, Timeout) ->
-    gen_server:call(Pid, Msg, Timeout).
+    try gen_server:call(Pid, Msg)
+    catch
+ 	exit:{noproc, _} ->
+ 	    {error, closed};
+	exit:{normal, _} ->
+	    {error, closed};
+	exit:{{shutdown, _},_} ->
+	    {error, closed}
+    end.
 
 cast(Msg, Pid) ->
     gen_server:cast(Pid, Msg).
diff --git a/lib/inets/src/http_client/httpc_manager.erl b/lib/inets/src/http_client/httpc_manager.erl
index a63864493f..ffdf1603b3 100644
--- a/lib/inets/src/http_client/httpc_manager.erl
+++ b/lib/inets/src/http_client/httpc_manager.erl
@@ -849,11 +849,11 @@ pipeline_or_keep_alive(#request{id   = Id,
 				from = From} = Request, 
 		       HandlerPid, 
 		       #state{handler_db = HandlerDb} = State) ->
-    case (catch httpc_handler:send(Request, HandlerPid)) of
+    case httpc_handler:send(Request, HandlerPid) of
 	ok ->
 	    HandlerInfo = {Id, HandlerPid, From}, 
 	    ets:insert(HandlerDb, HandlerInfo);
-	_  -> % timeout pipelining failed
+	{error, closed}  -> % timeout pipelining failed
 	    start_handler(Request, State)
     end.
 
diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl
index cc166d522e..75b50f3420 100644
--- a/lib/inets/test/httpc_SUITE.erl
+++ b/lib/inets/test/httpc_SUITE.erl
@@ -57,7 +57,7 @@ all() ->
 groups() ->
     [
      {http, [], real_requests()},
-     {sim_http, [], only_simulated()},
+     {sim_http, [], only_simulated() ++ [process_leak_on_keepalive]},
      {https, [], real_requests()},
      {sim_https, [], only_simulated()},
      {misc, [], misc()}
@@ -117,7 +117,6 @@ only_simulated() ->
      empty_response_header,
      remote_socket_close,
      remote_socket_close_async,
-     process_leak_on_keepalive,
      transfer_encoding,
      transfer_encoding_identity,
      redirect_loop,
-- 
2.15.0

openSUSE Build Service is sponsored by