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

openSUSE Build Service is sponsored by