]> granicus.if.org Git - ejabberd/commitdiff
Don't crash on invalid module's sub-options
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 16 Apr 2018 08:06:57 +0000 (11:06 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Mon, 16 Apr 2018 08:06:57 +0000 (11:06 +0300)
Fixes #2387

src/gen_mod.erl

index 3b63ed74ac8ec2006055e712c34f3216f449d240..0b7820fc6c54df400e8aa57e97d5c56fa108e93b 100644 (file)
@@ -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];
                              _ ->