From a264d73ed3fd6d8cd5fea07b7edb338a61e8d847 Mon Sep 17 00:00:00 2001 From: Ingela Anderton Andin Date: Thu, 11 Feb 2021 09:06:55 +0100 Subject: ssl: Avoid race when two upgrade servers are started close to each other --- lib/ssl/src/ssl_upgrade_server_session_cache_sup.erl | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/ssl/src/ssl_upgrade_server_session_cache_sup.erl b/lib/ssl/src/ssl_upgrade_server_session_cache_sup.erl index 3e1f1a10cf..936ffcc0ac 100644 --- a/lib/ssl/src/ssl_upgrade_server_session_cache_sup.erl +++ b/lib/ssl/src/ssl_upgrade_server_session_cache_sup.erl @@ -50,12 +50,21 @@ start_child(Type) -> Children = supervisor:count_children(SupName), Workers = proplists:get_value(workers, Children), case Workers of - 0 -> - supervisor:start_child(SupName, [ssl_unknown_listener | ssl_config:pre_1_3_session_opts()]); - 1 -> - [{_,Child,_, _}] = supervisor:which_children(SupName), + 0 -> + %% In case two upgrade servers are started very close to each other + %% only one will be able to grab the local name and we will use + %% that process for handling pre TLS-1.3 sessions for + %% servers with to us unknown listeners. + case supervisor:start_child(SupName, [ssl_unknown_listener | ssl_config:pre_1_3_session_opts()]) of + {error, {already_started, Child}} -> + {ok, Child}; + {ok, _} = Return -> + Return + end; + 1 -> + [{_,Child,_, _}] = supervisor:which_children(SupName), {ok, Child} - end. + end. %%%========================================================================= %%% Supervisor callback -- cgit v1.2.1