File 0142-proc_lib-Don-t-call-erlang-get_stacktrace-0-twice.patch of Package erlang

From 652486205f6bfd32721f618c1191422182e77553 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Wed, 17 May 2017 13:06:36 +0200
Subject: [PATCH 2/2] proc_lib: Don't call erlang:get_stacktrace/0 twice

proc_lib calls erlang:get_stacktrace/0 twice, which is unnecessary,
and potentially unsafe since there are calls to many functions
in between. Any of the calls could potentially cause and catch
an exception, invalidating the stacktrace.

Only call erlang:get_stacktrace/0 once, and pass the result to
the second place where it is needed.
---
 lib/stdlib/src/proc_lib.erl | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/lib/stdlib/src/proc_lib.erl b/lib/stdlib/src/proc_lib.erl
index 363705b0f..2219467a8 100644
--- a/lib/stdlib/src/proc_lib.erl
+++ b/lib/stdlib/src/proc_lib.erl
@@ -264,12 +264,12 @@ exit_p(Class, Reason, Stacktrace) ->
     case get('$initial_call') of
 	{M,F,A} when is_atom(M), is_atom(F), is_integer(A) ->
 	    MFA = {M,F,make_dummy_args(A, [])},
-	    crash_report(Class, Reason, MFA),
+	    crash_report(Class, Reason, MFA, Stacktrace),
 	    erlang:raise(exit, exit_reason(Class, Reason, Stacktrace), Stacktrace);
 	_ ->
 	    %% The process dictionary has been cleared or
 	    %% possibly modified.
-	    crash_report(Class, Reason, []),
+	    crash_report(Class, Reason, [], Stacktrace),
 	    erlang:raise(exit, exit_reason(Class, Reason, Stacktrace), Stacktrace)
     end.
 
@@ -499,24 +499,25 @@ trans_init(M, F, A) when is_atom(M), is_atom(F) ->
 %% Generate a crash report.
 %% -----------------------------------------------------
 
-crash_report(exit, normal, _)       -> ok;
-crash_report(exit, shutdown, _)     -> ok;
-crash_report(exit, {shutdown,_}, _) -> ok;
-crash_report(Class, Reason, StartF) ->
-    OwnReport = my_info(Class, Reason, StartF),
+crash_report(exit, normal, _, _)       -> ok;
+crash_report(exit, shutdown, _, _)     -> ok;
+crash_report(exit, {shutdown,_}, _, _) -> ok;
+crash_report(Class, Reason, StartF, Stacktrace) ->
+    OwnReport = my_info(Class, Reason, StartF, Stacktrace),
     LinkReport = linked_info(self()),
     Rep = [OwnReport,LinkReport],
     error_logger:error_report(crash_report, Rep).
 
-my_info(Class, Reason, []) ->
-    my_info_1(Class, Reason);
-my_info(Class, Reason, StartF) ->
-    [{initial_call, StartF}|my_info_1(Class, Reason)].
+my_info(Class, Reason, [], Stacktrace) ->
+    my_info_1(Class, Reason, Stacktrace);
+my_info(Class, Reason, StartF, Stacktrace) ->
+    [{initial_call, StartF}|
+     my_info_1(Class, Reason, Stacktrace)].
 
-my_info_1(Class, Reason) ->
+my_info_1(Class, Reason, Stacktrace) ->
     [{pid, self()},
      get_process_info(self(), registered_name),         
-     {error_info, {Class,Reason,erlang:get_stacktrace()}}, 
+     {error_info, {Class,Reason,Stacktrace}},
      get_ancestors(self()),        
      get_process_info(self(), messages),
      get_process_info(self(), links),
-- 
2.13.0

openSUSE Build Service is sponsored by