File 0741-kernel-Fix-erl_epmd-address_please.patch of Package erlang

From 13a3bea7c7a48034db4de768e655837f5c66dd2a Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Tue, 2 Nov 2021 13:21:29 +0100
Subject: [PATCH 1/2] kernel: Fix erl_epmd:address_please

The initial check for ipv4 vs ipv6 did not use the
erl_epmd interface to lookup the address which caused
invalid addresses to not be resolvable by erl_epmd callback
modules.

Closes #5334
---
 erts/emulator/test/distribution_SUITE.erl | 28 +++++++++++++++--------
 lib/kernel/src/dist_util.erl              |  4 +++-
 lib/kernel/src/inet_tcp_dist.erl          | 14 ++++++------
 3 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/erts/emulator/test/distribution_SUITE.erl b/erts/emulator/test/distribution_SUITE.erl
index 496e80b9ac..8f3c1f3903 100644
--- a/erts/emulator/test/distribution_SUITE.erl
+++ b/erts/emulator/test/distribution_SUITE.erl
@@ -2558,17 +2558,23 @@ no_epmd(Config) when is_list(Config) ->
 epmd_module(Config) when is_list(Config) ->
     %% We need a relay node to test this, since the test node uses the
     %% standard epmd module.
-    Sock1 = start_relay_node(epmd_module_node1, "-epmd_module " ++ ?MODULE_STRING),
-    Node1 = inet_rpc_nodename(Sock1),
+    {N1,_,S1} = Sock1 = start_relay_node(
+                          epmd_module_node1,
+                          "-epmd_module " ++ ?MODULE_STRING,
+                         [{"ERL_AFLAGS","-sname epmd_module_node1@dummy " ++ os:getenv("ERL_AFLAGS","")}]),
+    Node1 = inet_rpc_nodename({N1,"dummy",S1}),
     %% Ask what port it's listening on - it won't have registered with
     %% epmd.
     {ok, {ok, Port1}} = do_inet_rpc(Sock1, application, get_env, [kernel, dist_listen_port]),
 
     %% Start a second node, passing the port number as a secret
     %% argument.
-    Sock2 = start_relay_node(epmd_module_node2, "-epmd_module " ++ ?MODULE_STRING
-			     ++ " -other_node_port " ++ integer_to_list(Port1)),
-    Node2 = inet_rpc_nodename(Sock2),
+    {N2,_,S2} = Sock2 = start_relay_node(
+                          epmd_module_node2,
+                          "-epmd_module " ++ ?MODULE_STRING
+                          ++ " -other_node_port " ++ integer_to_list(Port1),
+                          [{"ERL_AFLAGS","-sname epmd_module_node2@dummy " ++ os:getenv("ERL_AFLAGS","")}]),
+    Node2 = inet_rpc_nodename({N2,"dummy",S2}),
     %% Node 1 can't ping node 2
     {ok, pang} = do_inet_rpc(Sock1, net_adm, ping, [Node2]),
     {ok, []} = do_inet_rpc(Sock1, erlang, nodes, []),
@@ -2608,10 +2614,11 @@ port_please(_Name, _Ip) ->
 	    {port, Port, Version}
     end.
 
-address_please(_Name, _Address, _AddressFamily) ->
+address_please(_Name, "dummy", inet) ->
     %% Use localhost.
-    IP = {127,0,0,1},
-    {ok, IP}.
+    {ok, {127,0,0,1}};
+address_please(_Name, "dummy", inet6) ->
+    {ok, {0,0,0,0,0,0,0,1}}.
 
 hopefull_data_encoding(Config) when is_list(Config) ->
 
@@ -2965,6 +2972,8 @@ inet_rpc_server_loop(Sock) ->
 
 
 start_relay_node(Node, Args) ->
+    start_relay_node(Node, Args, []).
+start_relay_node(Node, Args, Env) ->
     Pa = filename:dirname(code:which(?MODULE)),
     Cookie = "NOT"++atom_to_list(erlang:get_cookie()),
     {ok, LSock} = gen_tcp:listen(0, [binary, {packet, 4}, {active, false}]),
@@ -2973,7 +2982,8 @@ start_relay_node(Node, Args) ->
     RunArg = "-run " ++ atom_to_list(?MODULE) ++ " inet_rpc_server " ++
     Host ++ " " ++ integer_to_list(Port),
     {ok, NN} = test_server:start_node(Node, peer,
-                                      [{args, Args ++
+                                      [{env,Env},
+                                       {args, Args ++
                                         " -setcookie "++Cookie++" -pa "++Pa++" "++
                                         RunArg}]),
     [N,H] = string:lexemes(atom_to_list(NN),"@"),
diff --git a/lib/kernel/src/dist_util.erl b/lib/kernel/src/dist_util.erl
index 5930300747..ae00d885fc 100644
--- a/lib/kernel/src/dist_util.erl
+++ b/lib/kernel/src/dist_util.erl
@@ -828,7 +828,9 @@ split_node(Node) ->
                     Split;
                 false ->
                     {host,Host}
-            end
+            end;
+        _ ->
+            {error, {invalid_node, Node}}
     end.
 
 %% Check if connecting node is allowed to connect
diff --git a/lib/kernel/src/inet_tcp_dist.erl b/lib/kernel/src/inet_tcp_dist.erl
index ef0f06aef7..99d8ddaba8 100644
--- a/lib/kernel/src/inet_tcp_dist.erl
+++ b/lib/kernel/src/inet_tcp_dist.erl
@@ -39,9 +39,6 @@
 
 -include("net_address.hrl").
 
-
-
-
 -include("dist.hrl").
 -include("dist_util.hrl").
 
@@ -54,10 +51,13 @@ select(Node) ->
     gen_select(inet_tcp, Node).
 
 gen_select(Driver, Node) ->
-    case split_node(atom_to_list(Node), $@, []) of
-	[_, Host] ->
-	    case inet:getaddr(Host, Driver:family()) of
-                {ok,_} -> true;
+    case dist_util:split_node(Node) of
+	{node, Name, Host} ->
+            case call_epmd_function(
+                   net_kernel:epmd_module(), address_please,
+                   [Name, Host, Driver:family()]) of
+                {ok, _Addr} -> true;
+                {ok, _Addr, _Port, _Creation} -> true;
                 _ -> false
             end;
 	_ -> false
-- 
2.31.1

openSUSE Build Service is sponsored by