From fb1f6b146c93211fed8d255fd967f69084922645 Mon Sep 17 00:00:00 2001 From: Dan Gudmundsson <dgud@erlang.org> Date: Mon, 17 Mar 2025 10:59:35 +0100 Subject: [PATCH] Fix crash in initial_call If user set the initial_call to undefined or something else, the shells process list function 'i()' crashed. --- lib/stdlib/src/proc_lib.erl | 2 ++ lib/stdlib/test/proc_lib_SUITE.erl | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/stdlib/src/proc_lib.erl b/lib/stdlib/src/proc_lib.erl index 80909fb2c293..7633b2b50ec9 100644 --- a/lib/stdlib/src/proc_lib.erl +++ b/lib/stdlib/src/proc_lib.erl @@ -902,6 +902,8 @@ raw_initial_call(ProcInfo) when is_list(ProcInfo) -> case lists:keyfind({dictionary, '$initial_call'}, 1, ProcInfo) of {{dictionary,_}, {_,_,_}=MFA} -> MFA; + {{dictionary,_}, _} -> + false; false -> case lists:keyfind(dictionary, 1, ProcInfo) of {dictionary,Dict} -> diff --git a/lib/stdlib/test/proc_lib_SUITE.erl b/lib/stdlib/test/proc_lib_SUITE.erl index 6683fd7d2a14..4b9f59b76ed2 100644 --- a/lib/stdlib/test/proc_lib_SUITE.erl +++ b/lib/stdlib/test/proc_lib_SUITE.erl @@ -383,6 +383,20 @@ spawn_opt(Config) when is_list(Config) -> FunMFArgs = proc_lib:initial_call(Pid1), FunMFArity = proc_lib:translate_initial_call(Pid1), Pid1 ! die, + + %% Check modified initial_call + + Pid2 = proc_lib:spawn_opt(fun() -> + put('$initial_call', undefined), + receive _ -> ok end + end, [link]), + false = proc_lib:initial_call(Pid2), + {proc_lib, init_p, 5} = proc_lib:translate_initial_call(Pid2), + Dict2 = process_info(Pid2, [{dictionary, '$initial_call'}]), + false = proc_lib:initial_call(Dict2), + {proc_lib, init_p, 5} = proc_lib:translate_initial_call(Dict2), + + Pid2 ! die, ok.