From f44b8ce6071a7230f11d12f37a50bc01b9cf8e56 Mon Sep 17 00:00:00 2001 From: tigercl Date: Sat, 23 Nov 2019 10:11:48 +0800 Subject: [PATCH] Avoid emqx crashes due to auth plugins (#3047) 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 39c692b4a..50c710670 100644 --- a/src/emqx_hooks.erl +++ b/src/emqx_hooks.erl @@ -127,7 +127,7 @@ run_fold(HookPoint, Args, Acc) -> do_run_fold(lookup(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: @@ -140,7 +140,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 @@ -160,6 +160,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);