File 0936-inets-Handle-that-inet-ssl-setopt-can-return-error.patch of Package erlang

From 6881c9c532c7d9d19f039e2aa80c1d740295d220 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Thu, 11 Jun 2020 09:53:30 +0200
Subject: [PATCH 3/3] inets: Handle that inet/ssl:setopt can return error

---
 lib/ftp/src/ftp.erl                           |  4 +-
 lib/inets/src/http_client/httpc_handler.erl   | 18 ++++----
 lib/inets/src/http_lib/http_transport.erl     |  6 +++
 .../src/http_server/httpd_request_handler.erl | 45 ++++++++++---------
 4 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/lib/inets/src/ftp/ftp.erl b/lib/inets/src/ftp/ftp.erl
index dac316fe0b..b94c535467 100644
--- a/lib/inets/src/ftp/ftp.erl
+++ b/lib/inets/src/ftp/ftp.erl
@@ -2274,8 +2274,8 @@ activate_connection(Socket) ->
             activate_connection(ssl, ssl_closed, Socket)
     end.
 
-activate_connection(API, CloseTag, Socket) ->
-    Socket = unwrap_socket(Socket),
+activate_connection(API, CloseTag, Socket0) ->
+    Socket = unwrap_socket(Socket0),
     case API:setopts(Socket, [{active, once}]) of
         ok ->
             ok;
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 3f91ae062c..1f8806d1d8 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -831,8 +831,7 @@ connect_and_send_first_request(Address, Request, #state{options = Options0} = St
                                            headers = undefined,
                                            body = undefined,
                                            status = new},
-                    http_transport:setopts(SocketType,
-                                           Socket, [{active, once}]),
+                    activate_once(Session),
                     NewState = activate_request_timeout(TmpState),
                     {ok, NewState};
                 {error, Reason} ->
@@ -1238,7 +1237,12 @@ case_insensitive_header(Str) ->
     Str.
 
 activate_once(#session{socket = Socket, socket_type = SocketType}) ->
-    http_transport:setopts(SocketType, Socket, [{active, once}]).
+    case http_transport:setopts(SocketType, Socket, [{active, once}]) of
+        ok ->
+            ok;
+        {error, _} -> %% inet can return einval instead of closed
+            self() ! {http_transport:close_tag(SocketType), Socket}
+    end.
 
 close_socket(#session{socket = {remote_close,_}}) ->
     ok;
@@ -1581,8 +1585,7 @@ send_raw(SocketType, Socket, ProcessBody, Acc) ->
             end
     end.
 
-tls_tunnel(Address, Request, #state{session = #session{socket = Socket, 
-						       socket_type = SocketType} = Session} = State, 
+tls_tunnel(Address, Request, #state{session = #session{} = Session} = State, 
 	   ErrorHandler) ->
     UpgradeRequest = tls_tunnel_request(Request), 
     case httpc_request:send(Address, Session, UpgradeRequest) of
@@ -1594,8 +1597,7 @@ tls_tunnel(Address, Request, #state{session = #session{socket = Socket,
 				       init_status_line(UpgradeRequest),
 				   headers = undefined,
 				   body = undefined},
-	    http_transport:setopts(SocketType,
-				   Socket, [{active, once}]),
+	    activate_once(Session),
 	    NewState = activate_request_timeout(TmpState),
 	    {ok, NewState#state{status = {ssl_tunnel, Request}}};
 	{error, Reason} ->
@@ -1661,7 +1663,7 @@ tls_upgrade(#state{status =
 			type = SessionType,
 			client_close = ClientClose},
 	    httpc_request:send(Address, Session, Request), 
-	    http_transport:setopts(SocketType, TLSSocket, [{active, once}]),
+            activate_once(Session),
 	    NewState = State#state{session = Session,
 				   request = Request,
 				   mfa = init_mfa(Request, State),
diff --git a/lib/inets/src/http_lib/http_transport.erl b/lib/inets/src/http_lib/http_transport.erl
index d5e1d71336..d2148a3a8a 100644
--- a/lib/inets/src/http_lib/http_transport.erl
+++ b/lib/inets/src/http_lib/http_transport.erl
@@ -27,6 +27,7 @@
 	 listen/4, listen/5,
 	 accept/2, accept/3, 
 	 close/2,
+         close_tag/1,
 	 send/3, 
 	 controlling_process/3, 
 	 setopts/3, getopts/2, getopts/3, 
@@ -459,6 +460,11 @@ ipv6_name({A, B, C, D, E, F, G, H}) ->
 	http_util:integer_to_hexlist(H).
 
 
+close_tag(ip_comm) ->
+    tcp_closed;
+close_tag(_) ->
+    ssl_closed.
+
 %%%========================================================================
 %%% Internal functions
 %%%========================================================================
-- 
2.26.2

openSUSE Build Service is sponsored by