From d730b2449459e8dab527af0ac9a822c8fbcf8ef1 Mon Sep 17 00:00:00 2001 From: tigercl Date: Sat, 23 Nov 2019 10:12:01 +0800 Subject: [PATCH] Avoid emqx crashes due to auth plugins (#3048) Avoid emqx crashes due to auth plugins --- src/emqx_hooks.erl | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/emqx_hooks.erl b/src/emqx_hooks.erl index 594aacbec..ee4fedf05 100644 --- a/src/emqx_hooks.erl +++ b/src/emqx_hooks.erl @@ -115,7 +115,7 @@ run_fold(HookPoint, Args, Acc) -> 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 -> ok; %% 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) -> 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 -> Acc; %% stop the hook chain with NewAcc @@ -148,6 +148,15 @@ filter_passed(undefined, _Args) -> true; filter_passed(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. execute(Fun, Args) when is_function(Fun) -> erlang:apply(Fun, Args);