From d7f3812f99a8491732dea65781f906e1394c3585 Mon Sep 17 00:00:00 2001 From: Ulf Wiger Date: Fri, 14 Mar 2025 23:12:05 +0100 Subject: [PATCH] Fix some decoding crashes with .eterm --- rebar.config | 3 +-- src/gmconfig.erl | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/rebar.config b/rebar.config index 35fcd16..e359a6a 100644 --- a/rebar.config +++ b/rebar.config @@ -3,8 +3,7 @@ {plugins, [rebar3_hex]}. {deps, [ - {setup, {git, "https://github.com/uwiger/setup.git", {ref, "9675f9a"}}} - %% , {setup, "2.1.2"} + {setup, "2.2.1"} ]}. {profiles, [ diff --git a/src/gmconfig.erl b/src/gmconfig.erl index 4047ab6..1a76f4f 100644 --- a/src/gmconfig.erl +++ b/src/gmconfig.erl @@ -119,7 +119,8 @@ mock_system_defaults(Config) -> -endif. -spec set_gmconfig_env(gmconfig()) -> ok. -set_gmconfig_env(Env) when is_map(Env) -> +set_gmconfig_env(Env0) when is_map(Env0) -> + Env = maps:merge(default_gmconfig_env(), Env0), persistent_term:put({?MODULE, gmconfig_env}, Env). -spec gmconfig_env() -> gmconfig(). @@ -941,7 +942,7 @@ read_file(F, Type, Decoder, Mode) -> try_decode_bin(Bin, Decoder, Type, Mode), F, Mode); {error, Reason} -> - ?LOG_ERROR("Read error ~s - ~p", [F, Reason]), + error_msg(Mode, "Read error ~s - ~p", [F, Reason]), error({read_error, F, Reason}) end. @@ -951,13 +952,29 @@ json_decode(Bin) when is_binary(Bin) -> json:decode(Bin). eterm_consult(Bin) -> - setup_file:consult_binary(Bin). + case setup_file:consult_binary(Bin) of + {ok, [Map]} when is_map(Map) -> + {ok, normalize_config(Map)}; + {ok, Other} -> + error({unknown_data, Other}); + {error, _} = Error -> + Error + end. + +normalize_config(Map) when is_map(Map) -> + try + json:decode(iolist_to_binary(json:encode(Map))) + catch + error:E -> + error({cannot_normalize, E, Map}) + end. try_decode_bin(Bin, Decoder, Fmt, Mode) -> try decode_bin(Bin, Decoder) catch - error:E -> - decode_fail(E, Fmt, Mode) + error:E:T -> + error_msg(Mode, "CAUGHT for ~p: ~p / ~p", [Fmt, E, T]), + error(E) end. decode_bin(Str, Decoder) when is_list(Str) -> @@ -969,13 +986,11 @@ decode_bin(Bin, Decoder) when is_binary(Bin), is_function(Decoder, 1) -> Map when is_map(Map) -> Map; {error, E} -> - error(E) + error(E); + Other -> + error({bad_decoder_return, Other}) end. -decode_fail(E, Fmt, Mode) -> - error_msg(Mode, "Parse error (~p)", [Fmt]), - erlang:error(E). - validate(JSON, F, Mode) when is_map(JSON) -> check_validation([validate_(JSON)], JSON, F, Mode).