File 4062-ssl-Sync-dtls-closing.patch of Package erlang

From 6f1fd30396626d99faf72668964badc1c1e7dc20 Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Wed, 27 Mar 2024 10:09:28 +0100
Subject: [PATCH 2/3] ssl: Sync dtls closing

Fixes some wobbling listening tests, that fails with already_listening
---
 lib/ssl/src/dtls_packet_demux.erl |  4 ++--
 lib/ssl/src/dtls_socket.erl       | 24 ++++++++++++++++++------
 lib/ssl/src/ssl.erl               |  7 ++++---
 3 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/lib/ssl/src/dtls_packet_demux.erl b/lib/ssl/src/dtls_packet_demux.erl
index 6623d6cc16..a3778fe1c7 100644
--- a/lib/ssl/src/dtls_packet_demux.erl
+++ b/lib/ssl/src/dtls_packet_demux.erl
@@ -149,9 +149,9 @@ handle_call(sockname, _, #state{listener = Socket} = State) ->
 handle_call(close, _, State0) ->
     case do_close(State0) of
         {stop, State} ->
-            {stop, normal, ok, State};
+            {stop, normal, stop, State};
         {wait, State} ->
-            {reply, ok, State}
+            {reply, waiting, State}
     end;
 handle_call({new_owner, Owner}, _, State) ->
     {reply, ok,  State#state{close = false, first = true, owner = Owner}};
diff --git a/lib/ssl/src/dtls_socket.erl b/lib/ssl/src/dtls_socket.erl
index b5302e9b6c..2f8f7ed5d2 100644
--- a/lib/ssl/src/dtls_socket.erl
+++ b/lib/ssl/src/dtls_socket.erl
@@ -35,7 +35,7 @@
          sockname/2,
          port/2,
          close/2,
-         close/1
+         close_listen/2
         ]).
 
 -export([emulated_options/0,
@@ -94,17 +94,29 @@ connect(Address, Port, #config{transport_info = {Transport, _, _, _, _} = CbInfo
 	    Error
     end.
 
-close(#sslsocket{pid = {dtls, #config{dtls_handler = {Pid, Port0},
-                                      inet_ssl = SockOpts}}}) ->
+close_listen(#sslsocket{pid = {dtls, #config{dtls_handler = {Pid, Port0},
+                                             inet_ssl = SockOpts}}}, Timeout) ->
     IP = proplists:get_value(ip, SockOpts, default_ip(SockOpts)),
     Port = get_real_port(Pid, Port0),
     dtls_listener_sup:register_listener({undefined, Pid}, IP, Port),
-    dtls_packet_demux:close(Pid).
+    case dtls_packet_demux:close(Pid) of
+        stop ->
+            erlang:monitor(process, Pid),
+            receive {'DOWN', _, process, Pid, _} ->
+                    ok
+            after Timeout ->
+                    {error, timeout}
+            end;
+        waiting ->
+            ok;
+        Error ->
+            Error
+    end.
 
 default_ip(SockOpts) ->
     case proplists:get_value(inet6, SockOpts, false) of
-                false -> {0,0,0,0};
-                true  -> {0,0,0,0, 0,0,0,0}
+        false -> {0,0,0,0};
+        true  -> {0,0,0,0, 0,0,0,0}
     end.
 
 close(gen_udp, {_Client, _Socket}) ->
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index 93a2c04250..c331de0f36 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -2240,7 +2240,7 @@ handshake_cancel(Socket) ->
 close(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) ->
     ssl_gen_statem:close(Pid, {close, ?DEFAULT_TIMEOUT});
 close(#sslsocket{pid = {dtls, #config{dtls_handler = {_, _}}}} = DTLSListen) ->
-    dtls_socket:close(DTLSListen);
+    dtls_socket:close_listen(DTLSListen, ?DEFAULT_TIMEOUT);
 close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_,_,_,_}}}}) ->
     Transport:close(ListenSocket).
 
@@ -2276,8 +2276,9 @@ close(#sslsocket{pid = [TLSPid|_]},
 close(#sslsocket{pid = [TLSPid|_]}, Timeout)
   when is_pid(TLSPid), ?IS_TIMEOUT(Timeout) ->
     ssl_gen_statem:close(TLSPid, {close, Timeout});
-close(#sslsocket{pid = {dtls, #config{dtls_handler = {_, _}}}} = DTLSListen, _) ->
-    dtls_socket:close(DTLSListen);
+close(#sslsocket{pid = {dtls, #config{dtls_handler = {_, _}}}} = DTLSListen, Timeout)
+  when ?IS_TIMEOUT(Timeout) ->
+    dtls_socket:close_listen(DTLSListen, Timeout);
 close(#sslsocket{pid = {ListenSocket, #config{transport_info={Transport,_,_,_,_}}}}, _) ->
     tls_socket:close(Transport, ListenSocket).
 
-- 
2.35.3

openSUSE Build Service is sponsored by