From fceeb3576cc1d6a3cf97a22651119a1b4c96eb48 Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@nilsson.ws>
Date: Sat, 14 Apr 2018 10:35:18 +0200
Subject: ssh: Fix server crashes for exit-normal signals

---
 lib/ssh/src/ssh_connection_handler.erl | 16 ++++++++++++++--
 1 file 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 =
-- 
cgit v1.2.3