Avoid emqx crashes due to auth plugins (#3048)

Avoid emqx crashes due to auth plugins
This commit is contained in:
tigercl 2019-11-23 10:12:01 +08:00 committed by GitHub
parent 978153d993
commit d730b24494
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 2 deletions

View File

@ -115,7 +115,7 @@ run_fold(HookPoint, Args, Acc) ->
do_run([#callback{action = Action, filter = Filter} | Callbacks], Args) -> do_run([#callback{action = Action, filter = Filter} | Callbacks], Args) ->
case filter_passed(Filter, Args) andalso execute(Action, Args) of case filter_passed(Filter, Args) andalso safe_execute(Action, Args) of
%% stop the hook chain and return %% stop the hook chain and return
stop -> ok; stop -> ok;
%% continue the hook chain, in following cases: %% continue the hook chain, in following cases:
@ -128,7 +128,7 @@ do_run([], _Args) ->
do_run_fold([#callback{action = Action, filter = Filter} | Callbacks], Args, Acc) -> do_run_fold([#callback{action = Action, filter = Filter} | Callbacks], Args, Acc) ->
Args1 = Args ++ [Acc], Args1 = Args ++ [Acc],
case filter_passed(Filter, Args1) andalso execute(Action, Args1) of case filter_passed(Filter, Args1) andalso safe_execute(Action, Args1) of
%% stop the hook chain %% stop the hook chain
stop -> Acc; stop -> Acc;
%% stop the hook chain with NewAcc %% stop the hook chain with NewAcc
@ -148,6 +148,15 @@ filter_passed(undefined, _Args) -> true;
filter_passed(Filter, Args) -> filter_passed(Filter, Args) ->
execute(Filter, Args). execute(Filter, Args).
safe_execute(Fun, Args) ->
try execute(Fun, Args) of
Result -> Result
catch
_:Reason:Stacktrace ->
?LOG(error, "Failed to execute ~p(~p): ~p", [Fun, Args, {Reason, Stacktrace}]);
ok
end.
%% @doc execute a function. %% @doc execute a function.
execute(Fun, Args) when is_function(Fun) -> execute(Fun, Args) when is_function(Fun) ->
erlang:apply(Fun, Args); erlang:apply(Fun, Args);