File 0694-esock-enet-Fixed-net-getaddrinfo.patch of Package erlang
From eddca2b05e80dc2ee64895c97fd33ab94db45151 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Thu, 11 Jul 2024 13:35:21 +0200
Subject: [PATCH] [esock|enet] Fixed net:getaddrinfo
The socket type field of the address info map was
incurrectly called 'type' sintead of 'socktype'.
This has now been corrected.
OTP-19132
---
erts/emulator/nifs/common/prim_net_nif.c | 15 +++++++++++----
erts/emulator/nifs/common/prim_socket_nif.c | 1 +
erts/emulator/nifs/common/socket_int.h | 1 +
lib/kernel/src/net.erl | 14 +++++++-------
lib/kernel/test/net_SUITE.erl | 2 +-
5 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/erts/emulator/nifs/common/prim_net_nif.c b/erts/emulator/nifs/common/prim_net_nif.c
index f8dc1856cd..e5b4502e0e 100644
--- a/erts/emulator/nifs/common/prim_net_nif.c
+++ b/erts/emulator/nifs/common/prim_net_nif.c
@@ -4751,17 +4751,24 @@ ERL_NIF_TERM encode_address_info_family(ErlNifEnv* env,
/* Convert an "native" socket type to an erlang socket type.
* Note that this is not currently exhaustive, but only supports
- * stream and dgram. Other values will be returned as is, that is
- * in the form of an integer.
+ * stream, dgram, raw, seqpacket and rdm.
+ * Also, the value 0 (zero) has the special meaning: any.
+ * Other values will be returned as is, that is in the form of
+ * an integer.
*/
static
ERL_NIF_TERM encode_address_info_type(ErlNifEnv* env,
int socktype)
{
ERL_NIF_TERM etype;
+ ERL_NIF_TERM zero = MKI(env, 0);
esock_encode_type(env, socktype, &etype);
- return etype;
+
+ if (IS_IDENTICAL(zero, etype))
+ return esock_atom_any;
+ else
+ return etype;
}
@@ -4775,7 +4782,7 @@ void make_address_info(ErlNifEnv* env,
ERL_NIF_TERM* ai)
{
ERL_NIF_TERM keys[] = {esock_atom_family,
- esock_atom_type,
+ esock_atom_socktype,
esock_atom_protocol,
esock_atom_addr};
ERL_NIF_TERM vals[] = {fam, sockType, proto, addr};
diff --git a/erts/emulator/nifs/common/prim_socket_nif.c b/erts/emulator/nifs/common/prim_socket_nif.c
index c147c07b22..80d7072c9a 100644
--- a/erts/emulator/nifs/common/prim_socket_nif.c
+++ b/erts/emulator/nifs/common/prim_socket_nif.c
@@ -4241,6 +4241,7 @@ static const struct in6_addr in6addr_loopback =
GLOBAL_ATOM_DECL(sndlowat); \
GLOBAL_ATOM_DECL(sndtimeo); \
GLOBAL_ATOM_DECL(socket); \
+ GLOBAL_ATOM_DECL(socktype); \
GLOBAL_ATOM_DECL(spec_dst); \
GLOBAL_ATOM_DECL(staticarp); \
GLOBAL_ATOM_DECL(status); \
diff --git a/erts/emulator/nifs/common/socket_int.h b/erts/emulator/nifs/common/socket_int.h
index 82fbd85331..c88efdd02d 100644
--- a/erts/emulator/nifs/common/socket_int.h
+++ b/erts/emulator/nifs/common/socket_int.h
@@ -438,6 +438,7 @@ typedef long ssize_t;
GLOBAL_ATOM_DEF(sndtimeo); \
GLOBAL_ATOM_DEF(socket); \
GLOBAL_ATOM_DEF(socket_tag); \
+ GLOBAL_ATOM_DEF(socktype); \
GLOBAL_ATOM_DEF(spec_dst); \
GLOBAL_ATOM_DEF(status); \
GLOBAL_ATOM_DEF(staticarp); \
diff --git a/lib/kernel/src/net.erl b/lib/kernel/src/net.erl
index 2f3fe5c83d..1513516bac 100644
--- a/lib/kernel/src/net.erl
+++ b/lib/kernel/src/net.erl
@@ -174,13 +174,13 @@ net:getifaddrs(
%% The following (ext) flags has been removed
%% (as they are deprecated by later version of gcc):
%% idn_allow_unassigned | idn_use_std3_ascii_rules.
--type name_info_flag_ext() :: idn.
--type name_info() :: #{host := string(),
- service := string()}.
--type address_info() :: #{family := socket:domain(),
- socktype := socket:type(),
- protocol := socket:protocol(),
- address := socket:sockaddr()}.
+-type name_info_flag_ext() :: idn.
+-type name_info() :: #{host := string(),
+ service := string()}.
+-type address_info() :: #{family := socket:domain(),
+ socktype := any | socket:type() | integer(),
+ protocol := socket:protocol(),
+ address := socket:sockaddr()}.
-type network_interface_name() :: string().
-type network_interface_index() :: non_neg_integer().
diff --git a/lib/kernel/test/net_SUITE.erl b/lib/kernel/test/net_SUITE.erl
index 62bdbef7f4..a19666dd1a 100644
--- a/lib/kernel/test/net_SUITE.erl
+++ b/lib/kernel/test/net_SUITE.erl
@@ -763,7 +763,7 @@ verify_addr_info2([#{addr := #{addr := Addr,
family := Domain,
port := Port},
family := Domain,
- type := _Type,
+ socktype := _Type,
protocol := _Proto}|T], Domain)
when is_integer(Port) andalso
(((Domain =:= inet) andalso is_tuple(Addr) andalso (size(Addr) =:= 4)) orelse
--
2.43.0