File 0837-Fix-handling-of-binary-data-with-address-in-UDP-recv.patch of Package erlang
From b848c0bfacf081cbcfb5206e01fb50fb31bcdaa3 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Mon, 4 Sep 2023 11:23:14 +0200
Subject: [PATCH] Fix handling of binary data with address in UDP recv
---
erts/preloaded/ebin/prim_inet.beam | Bin 101840 -> 102108 bytes
erts/preloaded/src/prim_inet.erl | 2 +-
lib/kernel/test/gen_udp_SUITE.erl | 30 ++++++++++++++++++++---------
3 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/erts/preloaded/src/prim_inet.erl b/erts/preloaded/src/prim_inet.erl
index 89ee3f150a..a9264d551a 100644
--- a/erts/preloaded/src/prim_inet.erl
+++ b/erts/preloaded/src/prim_inet.erl
@@ -2772,7 +2772,7 @@ rev([C|L],Acc) -> rev(L,[C|Acc]);
rev([],Acc) -> Acc.
split(N, L) -> split(N, L, []).
-split(0, L, R) when is_list(L) -> {rev(R),L};
+split(0, L, R) when is_list(L); is_binary(L) -> {rev(R),L};
split(N, [H|T], R) when is_integer(N), N > 0 -> split(N-1, T, [H|R]).
len(L, N) -> len(L, N, 0).
diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl
index a816041a70..8ba6ec8e2c 100644
--- a/lib/kernel/test/gen_udp_SUITE.erl
+++ b/lib/kernel/test/gen_udp_SUITE.erl
@@ -43,7 +43,7 @@
open_fd/1, connect/1, reconnect/1, implicit_inet6/1,
recvtos/1, recvtosttl/1, recvttl/1, recvtclass/1,
sendtos/1, sendtosttl/1, sendttl/1, sendtclass/1,
- local_basic/1, local_unbound/1,
+ local_basic/1, local_basic_binary/1, local_unbound/1,
local_fdopen/1, local_fdopen_unbound/1, local_abstract/1,
recv_close/1,
socket_monitor1/1,
@@ -148,6 +148,7 @@ recv_and_send_opts_cases() ->
local_cases() ->
[
local_basic,
+ local_basic_binary,
local_unbound,
local_fdopen,
local_fdopen_unbound,
@@ -1645,10 +1646,12 @@ verify_sets_eq(L1, L2) ->
local_basic(Config) ->
- ?TC_TRY(?FUNCTION_NAME, fun() -> do_local_basic(Config) end).
+ ?TC_TRY(?FUNCTION_NAME, fun() -> do_local_basic(Config, []) end).
+local_basic_binary(Config) ->
+ ?TC_TRY(?FUNCTION_NAME, fun() -> do_local_basic(Config, [binary]) end).
-do_local_basic(Config) ->
+do_local_basic(Config, Opts) ->
?P("begin"),
SFile = local_filename(server),
SAddr = {local,bin_filename(SFile)},
@@ -1658,9 +1661,9 @@ do_local_basic(Config) ->
_ = file:delete(CFile),
%%
?P("create server socket"),
- S = ok(?OPEN(Config, 0, [{ifaddr,{local,SFile}},{active,false}])),
+ S = ok(?OPEN(Config, 0, [{ifaddr,{local,SFile}},{active,false}|Opts])),
?P("create client socket"),
- C = ok(?OPEN(Config, 0, [{ifaddr,{local,CFile}},{active,false}])),
+ C = ok(?OPEN(Config, 0, [{ifaddr,{local,CFile}},{active,false}|Opts])),
SAddr = ok(inet:sockname(S)),
CAddr = ok(inet:sockname(C)),
?P("SockName(s):"
@@ -1811,18 +1814,27 @@ local_handshake(S, SAddr, C, CAddr) ->
?P("try (client) send"),
ok = gen_udp:send(C, SAddr, 0, CData),
?P("try (server) recv"),
+ CData1 = local_handshake_data(C, CData),
case ok(gen_tcp:recv(S, 112)) of
- {{unspec,<<>>}, 0, CData} when CAddr =:= undefined ->
+ {{unspec,<<>>}, 0, CData1} when CAddr =:= undefined ->
ok;
- {{local,<<>>}, 0, CData} when CAddr =:= undefined ->
+ {{local,<<>>}, 0, CData1} when CAddr =:= undefined ->
ok;
- {CAddr, 0, CData} when CAddr =/= undefined ->
+ {CAddr, 0, CData1} when CAddr =/= undefined ->
ok = gen_udp:send(S, CAddr, 0, SData),
- {SAddr, 0, SData} = ok(gen_tcp:recv(C, 112)),
+ SData1 = local_handshake_data(S, SData),
+ {SAddr, 0, SData1} = ok(gen_tcp:recv(C, 112)),
ok
end.
+local_handshake_data(S, Data) when is_list(Data) ->
+ case inet:getopts(S, [mode]) of
+ {ok,[{mode,binary}]} ->
+ list_to_binary(Data);
+ {ok,[{mode,list}]} ->
+ Data
+ end.
%%-------------------------------------------------------------
--
2.35.3