aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-04-16 11:06:57 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2018-04-16 11:06:57 +0300
commitb8505f3e78bb4c84e93f1a10611ab36358c00182 (patch)
tree7338e7d54496f04a4cd8b2e935a197c5e88c1803
parentmod_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.erl18
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];
_ ->