File 0489-Make-check-of-delay_send-error-more-forgiving.patch of Package erlang

From d0d2579f690794a7894f224b6bcd94fb77ea29e1 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 17 Jul 2019 15:21:53 +0200
Subject: [PATCH] Make check of delay_send error more forgiving

---
 lib/kernel/test/gen_tcp_misc_SUITE.erl | 53 +++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index de87bd9472..cd1bc2e0d1 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -3500,31 +3500,36 @@ wait(Mref) ->
 %% OTP-15536
 %% Test that send error works correctly for delay_send
 delay_send_error(_Config) ->
-    {ok, LS} = gen_tcp:listen(0, [{reuseaddr, true}, {packet, 1}, {active, false}]),
-    {ok,{{0,0,0,0},PortNum}}=inet:sockname(LS),
-    P = spawn_link(
-          fun() ->
-                  {ok, S} = gen_tcp:accept(LS),
-                  receive die -> gen_tcp:close(S) end
-          end),
-    erlang:monitor(process, P),
-    {ok, S} = gen_tcp:connect("localhost", PortNum,
-                              [{packet, 1}, {active, false}, {delay_send, true}]),
-
+    {ok, L} =
+        gen_tcp:listen(
+          0, [{reuseaddr, true}, {packet, 1}, {active, false}]),
+    {ok,{{0,0,0,0},PortNum}}=inet:sockname(L),
+    {ok, C} =
+        gen_tcp:connect(
+          "localhost", PortNum,
+          [{packet, 1}, {active, false}, {delay_send, true}]),
+    {ok, S} = gen_tcp:accept(L),
     %% Do a couple of sends first to see that it works
-    ok = gen_tcp:send(S, "hello"),
-    ok = gen_tcp:send(S, "hello"),
-    ok = gen_tcp:send(S, "hello"),
-
-    %% Make the receiver close
-    P ! die,
-    receive _Down -> ok end,
-
-    ok = gen_tcp:send(S, "hello"),
-    timer:sleep(500), %% Sleep in order for delay_send to have time to trigger
-
-    %% This used to result in a double free
-    {error, closed} = gen_tcp:send(S, "hello").
+    ok = gen_tcp:send(C, "hello"),
+    ok = gen_tcp:send(C, "hello"),
+    ok = gen_tcp:send(C, "hello"),
+    %% Close the receiver
+    ok = gen_tcp:close(S),
+    %%
+    case gen_tcp:send(C, "hello") of
+        ok ->
+            case gen_tcp:send(C, "hello") of
+                ok ->
+                    timer:sleep(1000), %% Sleep in order for delay_send to have time to trigger
+                    %% This used to result in a double free
+                    {error, closed} = gen_tcp:send(C, "hello");
+                {error, closed} ->
+                    ok
+            end;
+        {error, closed} ->
+            ok
+    end,
+    ok = gen_tcp:close(C).
 
 -define(ACTIVE_N, 20).
 
-- 
2.16.4

openSUSE Build Service is sponsored by