File 2058-Write-test-case-and-find-out-that-switching-from-act.patch of Package erlang

From 818d73d6a04fe12fea1166ff6fc5bbbeb8b91115 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 29 Apr 2020 11:29:38 +0200
Subject: [PATCH 2/2] Write test case and find out that switching from active
 mode to passive was not properly handled.

---
 lib/kernel/src/gen_tcp_socket.erl      | 14 ++++++++++++++
 lib/kernel/test/gen_tcp_echo_SUITE.erl | 10 ++++++++++
 2 files changed, 24 insertions(+)

diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl
index bb7350dd22..68733ce8e6 100644
--- a/lib/kernel/src/gen_tcp_socket.erl
+++ b/lib/kernel/src/gen_tcp_socket.erl
@@ -1713,6 +1713,10 @@ recv_data_deliver(
              [{reply, From, {ok, DeliverData}},
               {{timeout, recv}, cancel}
               | ActionsR]};
+        #{active := false} ->
+            D_1 = D#{buffer := unrecv_buffer(Data, maps:get(buffer, D))},
+            {recv_stop(next_packet(D_1, Packet, Data)),
+             ActionsR};
         #{active := Active} ->
             ModuleSocket = module_socket(P),
             Owner !
@@ -1781,6 +1785,16 @@ catbin(Bin, <<>>) when is_binary(Bin) -> Bin;
 catbin(Bin1, Bin2) when is_binary(Bin1), is_binary(Bin2) ->
     <<Bin1/binary, Bin2/binary>>.
 
+unrecv_buffer(Data, Buffer) ->
+    case Buffer of
+        <<>> ->
+            Data;
+        _ when is_binary(Buffer) ->
+            [Data, Buffer];
+        _ ->
+            [Data | Buffer]
+    end.
+
 condense_buffer([Bin]) when is_binary(Bin) -> Bin;
 condense_buffer(Buffer) ->
     iolist_to_binary(reverse_improper(Buffer, [])).
diff --git a/lib/kernel/test/gen_tcp_echo_SUITE.erl b/lib/kernel/test/gen_tcp_echo_SUITE.erl
index 1cf67a374a..e2b17d374b 100644
--- a/lib/kernel/test/gen_tcp_echo_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_echo_SUITE.erl
@@ -246,6 +246,16 @@ echo_packet0(Echo, Type, EchoFun, SlowEcho, Opts) ->
 	    echo_packet1(Echo, Type, EchoFun, infinite);
        true -> ok
     end,
+    PacketSize =:= 0 andalso
+        begin
+            %% Switch to raw mode and echo one byte 
+            ok = inet:setopts(Echo, [{packet, raw}, {active, false}]),
+            ok = gen_tcp:send(Echo, <<"$">>),
+            case gen_tcp:recv(Echo, 1) of
+                {ok, <<"$">>} -> ok;
+                {ok, "$"} -> ok
+            end
+        end,
     _CloseResult = gen_tcp:close(Echo),
     ct:log("echo_packet0[~w] close: ~p", [self(), _CloseResult]),
     ok.
-- 
2.16.4

openSUSE Build Service is sponsored by