File 0258-fix-logger-force-atom-format-strings-to-strings.patch of Package erlang
From 17c8fcf13775e41b5e6f526d08ec9d218d79d1e3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Niemier?= <lukasz@niemier.pl>
Date: Tue, 27 Jul 2021 17:41:45 +0200
Subject: [PATCH] fix(logger): force atom format strings to strings
This is meant to prevent situations when user will fire messages using
logger:notice(string, [$a]).
That would be accidentally treated the same as:
logger:notice("a").
As earlier both produced message in form of `{string, "a"}`. Now it
simply cast format strings to never be an atom. This isn't breaking
change as message was defined to be `{io:format(), [term()]}`, which
mean that both forms should be treated identically.
---
lib/kernel/src/logger.erl | 8 ++++++--
lib/kernel/test/logger_SUITE.erl | 26 +++++++++++++++++++++-----
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl
index ea75c8d720..cf4baedffc 100644
--- a/lib/kernel/src/logger.erl
+++ b/lib/kernel/src/logger.erl
@@ -1119,12 +1119,13 @@ log_fun_allowed(Location, Level, FunRes, Meta, FunCall) ->
Meta)
end.
-do_log_allowed(Level,{Format,Args}=Msg,Meta,Tid,Config)
+do_log_allowed(Level,{Format,Args},Meta,Tid,Config)
when ?IS_LEVEL(Level),
?IS_FORMAT(Format),
is_list(Args),
is_map(Meta) ->
- logger_backend:log_allowed(#{level=>Level,msg=>Msg,meta=>Meta},Tid,Config);
+ logger_backend:log_allowed(#{level=>Level,msg=>{deatomize(Format),Args},meta=>Meta},
+ Tid,Config);
do_log_allowed(Level,Report,Meta,Tid,Config)
when ?IS_LEVEL(Level),
?IS_REPORT(Report),
@@ -1140,6 +1141,9 @@ do_log_allowed(Level,String,Meta,Tid,Config)
tid() ->
ets:whereis(?LOGGER_TABLE).
+deatomize(Atom) when is_atom(Atom) -> atom_to_list(Atom);
+deatomize(Other) -> Other.
+
log_remote(Node,Level,{Format,Args},Meta) ->
log_remote(Node,{log,Level,Format,Args,Meta});
log_remote(Node,Level,Msg,Meta) ->
diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl
index 82533ab572..851cc520d6 100644
--- a/lib/kernel/test/logger_SUITE.erl
+++ b/lib/kernel/test/logger_SUITE.erl
@@ -76,7 +76,7 @@ end_per_testcase(Case, Config) ->
groups() ->
[].
-all() ->
+all() ->
[start_stop,
add_remove_handler,
multiple_handlers,
@@ -102,7 +102,8 @@ all() ->
process_metadata,
app_config,
kernel_config,
- pretty_print].
+ pretty_print,
+ pathological].
start_stop(_Config) ->
S = whereis(logger),
@@ -1219,6 +1220,21 @@ pretty_print(_Config) ->
IHs = ["Handler configuration: \n"|IHs2],
ok.
+pathological(cleanup,_Config) ->
+ logger:remove_handler(p1),
+ logger:set_primary_config(level,notice),
+ logger:unset_module_level(?MODULE),
+ ok.
+
+pathological(_Config) ->
+ ok = logger:set_primary_config(level,all),
+ ok = logger:add_handler(p1,?MODULE,#{level=>all,filter_default=>log}),
+ logger:notice(string, []),
+ check_logged(notice,"string",[],#{}),
+ logger:notice(report, []),
+ check_logged(notice,"report",[],#{}),
+ ok.
+
%%%-----------------------------------------------------------------
%%% Internal
check_logged(Level,Format,Args,Meta) ->
@@ -1299,7 +1315,7 @@ test_api(Level) ->
logger:Level("~w: ~w",[Level,fa]),
ok = check_logged(Level,"~w: ~w",[Level,fa],#{}),
logger:Level('~w: ~w',[Level,fa]),
- ok = check_logged(Level,'~w: ~w',[Level,fa],#{}),
+ ok = check_logged(Level,"~w: ~w",[Level,fa],#{}),
logger:Level(<<"~w: ~w">>,[Level,fa]),
ok = check_logged(Level,<<"~w: ~w">>,[Level,fa],#{}),
logger:Level("~w: ~w ~w",[Level,fa,meta],#{my=>meta}),
@@ -1312,7 +1328,7 @@ test_api(Level) ->
ok = check_logged(Level,<<"~w: ~w ~w">>,[Level,fun_to_fa,meta],#{my=>meta}),
logger:Level(fun(x) -> {'~w: ~w ~w',[Level,fun_to_fa,meta]} end,x,
#{my=>meta}),
- ok = check_logged(Level,'~w: ~w ~w',[Level,fun_to_fa,meta],#{my=>meta}),
+ ok = check_logged(Level,"~w: ~w ~w",[Level,fun_to_fa,meta],#{my=>meta}),
logger:Level(fun(x) -> #{Level=>fun_to_r,meta=>true} end,x,
#{my=>meta}),
ok = check_logged(Level,#{Level=>fun_to_r,meta=>true},#{my=>meta}),
@@ -1343,7 +1359,7 @@ test_log_function(Level) ->
ok = check_logged(Level,<<"~w: ~w ~w">>,[Level,fun_to_fa,meta],#{my=>meta}),
logger:log(Level,fun(x) -> {'~w: ~w ~w',[Level,fun_to_fa,meta]} end,
x, #{my=>meta}),
- ok = check_logged(Level,'~w: ~w ~w',[Level,fun_to_fa,meta],#{my=>meta}),
+ ok = check_logged(Level,"~w: ~w ~w",[Level,fun_to_fa,meta],#{my=>meta}),
logger:log(Level,fun(x) -> #{Level=>fun_to_r,meta=>true} end,
x, #{my=>meta}),
ok = check_logged(Level,#{Level=>fun_to_r,meta=>true},#{my=>meta}),
--
2.31.1