File 3731-ssl-Use-proc_lib-set_label-1.patch of Package erlang

From 6535a27553798b4699a7ede82092d7cc9ed4ecae Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Fri, 12 Jan 2024 12:14:21 +0100
Subject: [PATCH] ssl: Use proc_lib:set_label/1

---
 lib/ssl/src/dtls_connection.erl           |  1 -
 lib/ssl/src/dtls_packet_demux.erl         |  1 +
 lib/ssl/src/ssl_gen_statem.erl            | 66 +++++++++++++++++++----
 lib/ssl/src/ssl_server_session_cache.erl  |  1 +
 lib/ssl/src/tls_sender.erl                |  1 +
 lib/ssl/src/tls_server_session_ticket.erl |  1 +
 lib/ssl/src/tls_socket.erl                |  1 +
 7 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/lib/ssl/src/dtls_connection.erl b/lib/ssl/src/dtls_connection.erl
index aa93b5482a..cedcd334ac 100644
--- a/lib/ssl/src/dtls_connection.erl
+++ b/lib/ssl/src/dtls_connection.erl
@@ -165,7 +165,6 @@
 %% Setup
 %%====================================================================
 init([Role, Host, Port, Socket, Options,  User, CbInfo]) ->
-    process_flag(trap_exit, true),
     State0 = initial_state(Role, Host, Port, Socket, Options, User, CbInfo),
     try
 	State = ssl_gen_statem:init_ssl_config(State0#state.ssl_options,
diff --git a/lib/ssl/src/dtls_packet_demux.erl b/lib/ssl/src/dtls_packet_demux.erl
index 86282d9e54..4a861b9619 100644
--- a/lib/ssl/src/dtls_packet_demux.erl
+++ b/lib/ssl/src/dtls_packet_demux.erl
@@ -115,6 +115,7 @@ init([Owner, Port0, TransportInfo, EmOpts, DTLSOptions, Socket]) ->
     InternalActiveN = get_internal_active_n(),
     erlang:monitor(process, Owner),
     {ok, SessionIdHandle} = session_id_tracker(Socket, DTLSOptions),
+    proc_lib:set_label({dtls_server_packet_demultiplexer, Port0}),
     {ok, #state{active_n = InternalActiveN,
                 port = Port0,
                 first = true,
diff --git a/lib/ssl/src/ssl_gen_statem.erl b/lib/ssl/src/ssl_gen_statem.erl
index 8d4e383f2f..8e90c0a23e 100644
--- a/lib/ssl/src/ssl_gen_statem.erl
+++ b/lib/ssl/src/ssl_gen_statem.erl
@@ -135,26 +135,67 @@ start_link(Role, Host, Port, Socket, {SslOpts, _, _} = Options, User, CbInfo) ->
 -spec init(list()) -> no_return().
 %% Description: Initialization
 %%--------------------------------------------------------------------
-init([Role, _Sender, _Host, _Port, _Socket, {TLSOpts, _, _},  _User, _CbInfo] = InitArgs) ->
+init([Role, _Sender, Host, Port, _Socket, {TLSOpts, _, _},  _User, _CbInfo] = InitArgs) ->
     process_flag(trap_exit, true),
+
     case maps:get(erl_dist, TLSOpts, false) of
         true ->
             process_flag(priority, max);
         _ ->
             ok
-    end,
-    case {Role, TLSOpts} of
-        {?CLIENT_ROLE, #{versions := [?TLS_1_3]}} ->
-            tls_client_connection_1_3:init(InitArgs);
-        {?SERVER_ROLE, #{versions := [?TLS_1_3]}} ->
-            tls_server_connection_1_3:init(InitArgs);
-        {_,_} ->
-            tls_connection:init(InitArgs)
+    end,    
+    
+    init_label(Role, Host, Port, TLSOpts),
+
+    case Role of 
+        ?CLIENT_ROLE ->
+            case TLSOpts of
+                #{versions := [?TLS_1_3]} ->
+                    tls_client_connection_1_3:init(InitArgs);
+                _  ->
+                    tls_connection:init(InitArgs)
+            end;     
+        ?SERVER_ROLE ->
+            case TLSOpts of
+                #{versions := [?TLS_1_3]} ->
+                    tls_server_connection_1_3:init(InitArgs);
+                _ ->
+                    tls_connection:init(InitArgs)
+            end                                                       
     end;
-init([_Role, _Host, _Port, _Socket, _TLSOpts, _User, _CbInfo] = InitArgs) ->
+init([Role, Host, Port, _Socket, {DTLSOpts,_,_}, _User, _CbInfo] = InitArgs) ->
     process_flag(trap_exit, true),
+    case Role of 
+        ?CLIENT_ROLE ->
+            init_label(Role, Host, Port, DTLSOpts);
+        ?SERVER_ROLE ->
+            init_label(Role, Host, Port, DTLSOpts)
+    end,
     dtls_connection:init(InitArgs).
 
+init_label(?CLIENT_ROLE = Role, Host, _, Options) ->
+    Protocol = maps:get(protocol, Options),
+    SNIStr =
+        case maps:get(server_name_indication, Options, undefined) of
+            undefined ->
+                host_str(Host);
+            SNIOpt ->
+                host_str(SNIOpt)
+        end,
+    SNI = erlang:iolist_to_binary(SNIStr),
+    proc_lib:set_label({Protocol, Role, SNI});
+init_label(?SERVER_ROLE = Role, _, Port, Options) ->
+    Protocol = maps:get(protocol, Options),
+    proc_lib:set_label({Protocol, Role, Port}).
+
+host_str(Host) when is_list(Host) ->
+    Host;
+host_str(Host) when is_tuple(Host) ->
+    IPStrs = [erlang:integer_to_list(I) || I <- tuple_to_list(Host)],
+    lists:join(".", IPStrs);
+host_str(Host) when is_atom(Host) ->
+    atom_to_list(Host).
+
 %%====================================================================
 %% TLS connection setup
 %%====================================================================
@@ -454,9 +495,12 @@ dist_handshake_complete(ConnectionPid, DHandle) ->
 
 handle_sni_extension(undefined, State) ->
     {ok, State};
-handle_sni_extension(#sni{hostname = Hostname}, State0) ->
+handle_sni_extension(#sni{hostname = Hostname}, #state{static_env = #static_env{port = Port},
+                                                       ssl_options = #{protocol := Protocol}} = State0) ->
     case check_hostname(Hostname) of
         ok ->
+
+            proc_lib:set_label({Protocol, ?SERVER_ROLE, erlang:iolist_to_binary(Hostname), Port}),
             {ok, handle_sni_hostname(Hostname, State0)};
         #alert{} = Alert ->
             {error, Alert}
diff --git a/lib/ssl/src/ssl_server_session_cache.erl b/lib/ssl/src/ssl_server_session_cache.erl
index 314a841351..46e052cdec 100644
--- a/lib/ssl/src/ssl_server_session_cache.erl
+++ b/lib/ssl/src/ssl_server_session_cache.erl
@@ -114,6 +114,7 @@ init([Listener, #{lifetime := Lifetime,
                  max := Max
                 }]) ->
     process_flag(trap_exit, true),
+    proc_lib:set_label({pre_tls_13_server_session_cache, Listener}),
     Monitor = monitor_listener(Listener),
     DbRef = init(Cb, [{role, server} | InitArgs]),
     State = #state{store_cb = Cb,
diff --git a/lib/ssl/src/tls_sender.erl b/lib/ssl/src/tls_sender.erl
index 455684bd87..9348b720b1 100644
--- a/lib/ssl/src/tls_sender.erl
+++ b/lib/ssl/src/tls_sender.erl
@@ -251,6 +251,7 @@ init({call, From}, {Pid, #{current_write := WriteState,
                                                 bytes_sent = 0,
                                                 log_level = LogLevel,
                                                 hibernate_after = HibernateAfter}},
+    proc_lib:set_label({tls_sender, Role, {connection, Pid}}),
     {next_state, handshake, StateData, [{reply, From, ok}]};
 init(info = Type, Msg, StateData) ->
     handle_common(?FUNCTION_NAME, Type, Msg, StateData);
diff --git a/lib/ssl/src/tls_server_session_ticket.erl b/lib/ssl/src/tls_server_session_ticket.erl
index a2e5c327a0..74e668d772 100644
--- a/lib/ssl/src/tls_server_session_ticket.erl
+++ b/lib/ssl/src/tls_server_session_ticket.erl
@@ -87,6 +87,7 @@ use(Pid, Identifiers, Prf, HandshakeHist) ->
 -spec init(Args :: term()) -> {ok, State :: term()}.                             
 init([Listener | Args]) ->
     process_flag(trap_exit, true),
+    proc_lib:set_label({tls_13_server_session_tickets, Listener}),
     Monitor = inet:monitor(Listener),
     State = initial_state(Args),
     {ok, State#state{listen_monitor = Monitor}}.
diff --git a/lib/ssl/src/tls_socket.erl b/lib/ssl/src/tls_socket.erl
index fd919f7356..4ffc17c20a 100644
--- a/lib/ssl/src/tls_socket.erl
+++ b/lib/ssl/src/tls_socket.erl
@@ -318,6 +318,7 @@ start_link(Port, SockOpts, SslOpts) ->
 %%--------------------------------------------------------------------
 init([Listen, Opts, SslOpts]) ->
     process_flag(trap_exit, true),
+    proc_lib:set_label({tls_listen_tracker, Listen}),
     Monitor = inet:monitor(Listen),
     {ok, #state{emulated_opts = do_set_emulated_opts(Opts, []), 
                 listen_monitor = Monitor,
-- 
2.43.0

openSUSE Build Service is sponsored by