diff options
| author | Erlang/OTP <[email protected]> | 2017-11-17 14:19:09 +0100 | 
|---|---|---|
| committer | Erlang/OTP <[email protected]> | 2017-11-17 14:19:09 +0100 | 
| commit | b291c961e83ff1fe82ee58b643919bcba434c19a (patch) | |
| tree | 19386c52f1dccc2dc38d355b60594fbd5fe6d175 | |
| parent | 4d9982b2412121cdd2cb20559e0569f7a01edb0b (diff) | |
| parent | 6642d2c27f29b4d7cb1d31c3397a8aec3860c98b (diff) | |
| download | otp-b291c961e83ff1fe82ee58b643919bcba434c19a.tar.gz otp-b291c961e83ff1fe82ee58b643919bcba434c19a.tar.bz2 otp-b291c961e83ff1fe82ee58b643919bcba434c19a.zip  | |
Merge branch 'hans/ssh/SYN_RST/OTP-14778' into maint-20
* hans/ssh/SYN_RST/OTP-14778:
  ssh: dialyzer fixes
  ssh: Fix broken error handling during session setup
| -rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 63 | 
1 files changed, 44 insertions, 19 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 4158a52a27..54fce6bd99 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -324,23 +324,32 @@ renegotiate_data(ConnectionHandler) ->  %% Internal process state  %%====================================================================  -record(data, { -	  starter                               :: pid(), +	  starter                               :: pid() +						 | undefined,  	  auth_user                             :: string()  						 | undefined,  	  connection_state                      :: #connection{}, -	  latest_channel_id         = 0         :: non_neg_integer(), +	  latest_channel_id         = 0         :: non_neg_integer() +                                                 | undefined,  	  idle_timer_ref                        :: undefined   						 | infinity  						 | reference(),  	  idle_timer_value          = infinity  :: infinity  						 | pos_integer(), -	  transport_protocol                    :: atom(),	% ex: tcp -	  transport_cb                          :: atom(),	% ex: gen_tcp -	  transport_close_tag                   :: atom(),	% ex: tcp_closed -	  ssh_params                            :: #ssh{}, -	  socket                                :: inet:socket(), -	  decrypted_data_buffer     = <<>>      :: binary(), -	  encrypted_data_buffer     = <<>>      :: binary(), +	  transport_protocol                    :: atom() +                                                 | undefined,	% ex: tcp +	  transport_cb                          :: atom() +                                                 | undefined,	% ex: gen_tcp +	  transport_close_tag                   :: atom() +                                                 | undefined,	% ex: tcp_closed +	  ssh_params                            :: #ssh{} +                                                 | undefined, +	  socket                                :: inet:socket() +                                                 | undefined, +	  decrypted_data_buffer     = <<>>      :: binary() +                                                 | undefined, +	  encrypted_data_buffer     = <<>>      :: binary() +                                                 | undefined,  	  undecrypted_packet_length             :: undefined | non_neg_integer(),  	  key_exchange_init_msg                 :: #ssh_msg_kexinit{}  						 | undefined, @@ -369,16 +378,17 @@ init_connection_handler(Role, Socket, Opts) ->                                    StartState,                                    D); -        {stop, enotconn} -> -	    %% Handles the abnormal sequence: -	    %%    SYN-> -	    %%            <-SYNACK -	    %%    ACK-> -	    %%    RST-> -	    exit({shutdown, "TCP connection to server was prematurely closed by the client"}); -         -	{stop, OtherError} -> -	    exit({shutdown, {init,OtherError}}) +        {stop, Error} -> +            Sups = ?GET_INTERNAL_OPT(supervisors, Opts), +            C = #connection{system_supervisor =     proplists:get_value(system_sup,     Sups), +                            sub_system_supervisor = proplists:get_value(subsystem_sup,  Sups), +                            connection_supervisor = proplists:get_value(connection_sup, Sups) +                           }, +            gen_statem:enter_loop(?MODULE, +                                  [], +                                  {init_error,Error}, +                                  #data{connection_state=C, +                                        socket=Socket})      end. @@ -531,6 +541,21 @@ renegotiation(_) -> false.  callback_mode() ->      handle_event_function. + +handle_event(_, _Event, {init_error,Error}, _) -> +    case Error of +        enotconn -> +           %% Handles the abnormal sequence: +           %%    SYN-> +           %%            <-SYNACK +           %%    ACK-> +           %%    RST-> +            {stop, {shutdown,"TCP connenction to server was prematurely closed by the client"}}; + +        OtherError -> +            {stop, {shutdown,{init,OtherError}}} +    end; +  %%% ######## {hello, client|server} ####  %% The very first event that is sent when the we are set as controlling process of Socket  handle_event(_, socket_control, {hello,_}, D) ->  | 
