Просмотр исходного кода

Fix the ws channel terminating crash when session pid is undefined

GilbertWong 6 лет назад
Родитель
Сommit
eb68ce77b6
1 измененных файлов с 11 добавлено и 6 удалено
  1. 11 6
      src/emqx_ws_channel.erl

+ 11 - 6
src/emqx_ws_channel.erl

@@ -312,20 +312,25 @@ terminate(WsReason, _Req, #state{keepalive   = Keepalive,
     case {ProtoState, Shutdown} of
         {undefined, _} -> ok;
         {_, {shutdown, Reason}} ->
-            SessionPid = emqx_protocol:session(ProtoState),
-            emqx_protocol:terminate(Reason, ProtoState),
-            SessionPid ! {'EXIT', self(), Reason};
+            terminate_session(Reason, ProtoState);
         {_, _Error} ->
             ?LOG(info, "Terminate for unexpected error: ~p", [WsReason]),
-            SessionPid = emqx_protocol:session(ProtoState),
-            emqx_protocol:terminate(unknown, ProtoState),
-            SessionPid ! {'EXIT', self(), unknown}
+            terminate_session(unknown, ProtoState)
     end.
 
 %%--------------------------------------------------------------------
 %% Internal functions
 %%--------------------------------------------------------------------
 
+terminate_session(Reason, ProtoState) ->
+    emqx_protocol:terminate(Reason, ProtoState),
+    case emqx_protocol:session(ProtoState) of
+        undefined ->
+            ok;
+        SessionPid ->
+            SessionPid ! {'EXIT', self(), Reason}
+    end.
+
 handle_incoming(Packet, SuccFun, State = #state{proto_state = ProtoState}) ->
     case emqx_protocol:received(Packet, ProtoState) of
         {ok, NProtoState} ->