Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
0837-Fix-handling-of-binary-data-with-address-i...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor