File 0237-kernel-esock-udp-Tweaked-open-to-properly-handle-the.patch of Package erlang
From 166d3008dbf3337f5f45af9a1d76f9fd7fb02ae6 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Fri, 6 Dec 2024 18:24:56 +0100
Subject: [PATCH 2/5] [kernel|esock|udp] Tweaked open to properly handle the
debug option
OTP-19386
---
lib/kernel/src/gen_udp_socket.erl | 45 +++++++++++++++++++++----------
1 file changed, 31 insertions(+), 14 deletions(-)
diff --git a/lib/kernel/src/gen_udp_socket.erl b/lib/kernel/src/gen_udp_socket.erl
index 1ec5e03e7d..2658842fa1 100644
--- a/lib/kernel/src/gen_udp_socket.erl
+++ b/lib/kernel/src/gen_udp_socket.erl
@@ -175,23 +175,23 @@ open(Service, Opts) ->
open_lookup(Service, Opts0) ->
%% ?DBG(['open lookup', {service, Service}, {opts, Opts0}]),
- {EinvalOpts, Opts_1} = setopts_split(einval, Opts0),
+ {EinvalOpts, Opts1} = setopts_split(einval, Opts0),
EinvalOpts =:= [] orelse exit(badarg),
- {Mod, Opts_2} = inet:udp_module(Opts_1),
+ {Mod, Opts2} = inet:udp_module(Opts1),
Domain = domain(Mod),
- {StartOpts, Opts_3} = setopts_split(start, Opts_2),
+ {StartOpts, Opts3} = setopts_split(start, Opts2),
ErrRef = make_ref(),
try
begin
%% IPs = val(ErrRef, Mod:getaddrs(Address, Domain)),
Port = val(ErrRef, Mod:getserv(Service)),
- %% Opts_4 = [{port, Port}, {buffer, ?RECBUF} | Opts_3],
- Opts_4 = [{port, Port} | Opts_3],
+ %% Opts_4 = [{port, Port}, {buffer, ?RECBUF} | Opts3],
+ Opts4 = [{port, Port} | Opts3],
#udp_opts{fd = Fd,
ifaddr = BindIP,
port = BindPort,
opts = OpenOpts} =
- val(ErrRef, inet:udp_options(Opts_4, Mod)),
+ val(ErrRef, inet:udp_options(Opts4, Mod)),
%% ?DBG([{fd, Fd}, {bind_ip, BindIP}, {bind_port, BindPort},
%% {opts, OpenOpts}]),
BindAddr = bind_addr(Domain, BindIP, BindPort, Fd),
@@ -203,21 +203,27 @@ open_lookup(Service, Opts0) ->
?badarg_exit({error, Reason})
end.
-do_open(Mod, BindAddr, Domain, OpenOpts, Opts, ExtraOpts) ->
+do_open(Mod, BindAddr, Domain, OpenOpts, Opts, ExtraOpts0) ->
%% ?DBG([{mod, Mod}, {bind_addr, BindAddr}, {domain, Domain},
- %% {open_opts, OpenOpts}, {opts, Opts}, {extra_opts, ExtraOpts}]),
+ %% {open_opts, OpenOpts}, {opts, Opts}, {extra_opts0, ExtraOpts0}]),
%%
%% The {netns, File} option is passed in Fd by inet:connect_options/2,
%% and then over to ExtraOpts.
- %% The {debug, Bool} option is passed in Opts since it is
- %% subversively classified as both start and socket option.
+ %% The {debug, Bool} option is passed in Opts (and also into ExtraOpts)
+ %% since it is subversively classified as both start and socket option
+ %% (and also open_opts).
%%
- {SocketOpts, StartOpts} = setopts_split(socket, Opts),
- %% ?DBG(['try start server', {socket, SocketOpts}, {start, StartOpts}]),
- case start_server(Mod, Domain, start_opts(StartOpts), ExtraOpts) of
+ {OOpts, Opts2} = setopts_split(open_opts, Opts),
+ ExtraOpts = extra_opts(OOpts, ExtraOpts0),
+ {SocketOpts, StartOpts0} = setopts_split(socket, Opts2),
+ StartOpts = start_opts(StartOpts0),
+ %% ?DBG(['try start server',
+ %% {start_opts, StartOpts},
+ %% {extra_opts, ExtraOpts}]),
+ case start_server(Mod, Domain, StartOpts, ExtraOpts) of
{ok, Server} ->
{PreBindSetOpts, OpenOpts2} = setopts_split(pre_bind, OpenOpts),
%% ?DBG([{pre_bind_open_opts, PreBindSetOpts},
@@ -276,6 +282,16 @@ extra_opts(OpenOpts) when is_list(OpenOpts) ->
%% to use this for [{netns,BinNS}] if that option is used...
maps:from_list(OpenOpts).
+%% Should we verify the options or just accept them?
+%% The *opt_categories functions *should* filter, so...
+extra_opts([], ExtraOpts)
+ when is_map(ExtraOpts) ->
+ ExtraOpts;
+extra_opts([{Opt, Val}|Opts], ExtraOpts)
+ when is_list(Opts) andalso is_map(ExtraOpts) ->
+ extra_opts(Opts, ExtraOpts#{Opt => Val}).
+
+
default_any(_Domain, #{fd := _}, _BindAddr) ->
undefined;
@@ -1032,7 +1048,8 @@ getopt_categories(Opt) ->
opt_categories(Tag) when is_atom(Tag) ->
case Tag of
sys_debug -> #{start => []};
- debug -> #{socket => [], start => []};
+ %% open_opts is for the 'Opts' argument of the socket:open call
+ debug -> #{socket => [], start => [], open_opts => []};
ipv6_v6only -> #{socket => [], pre_bind => []};
%% Some options may trigger us to choose recvmsg (instead of recvfrom)
--
2.43.0