diff options
author | Hans Nilsson <[email protected]> | 2017-11-14 19:33:34 +0100 |
---|---|---|
committer | Hans Nilsson <[email protected]> | 2017-11-14 21:24:30 +0100 |
commit | 5968beba4043823e25e975dd3c30ff0f37546c14 (patch) | |
tree | d8fd60ddb298724c39b06d23b8f8fc3cf08cfdd7 | |
parent | 84f29ab803e8f36ef058a47f4c2b224f4dd58220 (diff) | |
download | otp-5968beba4043823e25e975dd3c30ff0f37546c14.tar.gz otp-5968beba4043823e25e975dd3c30ff0f37546c14.tar.bz2 otp-5968beba4043823e25e975dd3c30ff0f37546c14.zip |
ssh: Fix broken error handling during session setup
-rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 4158a52a27..de4f26fea7 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -369,16 +369,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 +532,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) -> |