diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2018-04-16 11:06:57 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2018-04-16 11:06:57 +0300 |
commit | b8505f3e78bb4c84e93f1a10611ab36358c00182 (patch) | |
tree | 7338e7d54496f04a4cd8b2e935a197c5e88c1803 | |
parent | mod_push: Don't notify on stream errors (diff) |
Don't crash on invalid module's sub-options
Fixes #2387
-rw-r--r-- | src/gen_mod.erl | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/gen_mod.erl b/src/gen_mod.erl index 3b63ed74a..0b7820fc6 100644 --- a/src/gen_mod.erl +++ b/src/gen_mod.erl @@ -548,7 +548,7 @@ validate_opts(Host, Module, Opts0) -> end, [Module|SubMods]), Required = lists:filter(fun is_atom/1, DefaultOpts), try - Opts = merge_opts(Opts0, DefaultOpts), + Opts = merge_opts(Opts0, DefaultOpts, Module), {ok, case get_validators(Host, {Module, SubMods}) of undef -> Opts; @@ -645,8 +645,8 @@ list_known_opts(Host, Module) -> Module:mod_opt_type('') end. --spec merge_opts(opts(), opts()) -> opts(). -merge_opts(Opts, DefaultOpts) -> +-spec merge_opts(opts(), opts(), module()) -> opts(). +merge_opts(Opts, DefaultOpts, Module) -> Result = lists:foldr( fun({Opt, Default}, Acc) -> @@ -654,7 +654,17 @@ merge_opts(Opts, DefaultOpts) -> {_, Val} -> case Default of [{A, _}|_] when is_atom(A) andalso is_list(Val) -> - [{Opt, merge_opts(Val, Default)}|Acc]; + VFun = opt_type(modules), + try VFun(Val) of + NewVal -> + [{Opt, merge_opts(NewVal, Default, Module)}|Acc] + catch _:_ -> + ?ERROR_MSG( + "Ignoring invalid value '~p' for " + "option '~s' of module '~s'", + [Val, Opt, Module]), + [{Opt, Default}|Acc] + end; Val -> [{Opt, Default}|Acc]; _ -> |