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