summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Nilsson <hans@nilsson.ws>2018-04-14 10:35:18 +0200
committerHans Nilsson <hans@nilsson.ws>2018-04-14 10:35:18 +0200
commitfceeb3576cc1d6a3cf97a22651119a1b4c96eb48 (patch)
tree7944a3eb0a94db12c45ca79ca5f800fd74574d63
parentba3710484344ed57124574abcd0f19fbe251389c (diff)
downloaderlang-fceeb3576cc1d6a3cf97a22651119a1b4c96eb48.tar.gz
ssh: Fix server crashes for exit-normal signals
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index 8c73bb8946..1c46e4cd78 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -1087,8 +1087,20 @@ handle_info({'DOWN', _Ref, process, ChannelPid, _Reason}, Statename, State0) ->
{next_state, Statename, next_packet(State)};
%%% So that terminate will be run when supervisor is shutdown
-handle_info({'EXIT', _Sup, Reason}, _StateName, State) ->
- {stop, {shutdown, Reason}, State};
+handle_info({'EXIT',_Sup,Reason}, StateName, State) ->
+ if
+ State#state.role == client ->
+ %% OTP-8111 tells this function clause fixes a problem in
+ %% clients, but there were no check for that role.
+ {stop, {shutdown,Reason}, State};
+
+ Reason == normal ->
+ %% An exit normal should not cause a server to crash. This has happend...
+ {next_state, StateName, next_packet(State)};
+
+ true ->
+ {stop, {shutdown,Reason}, State}
+ end;
handle_info({check_cache, _ , _},
StateName, #state{connection_state =