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

openSUSE Build Service is sponsored by