File 2328-beam_validator-Verify-Y-registers-in-exception-causi.patch of Package erlang

From 84150137640481ac139325bf8cc665dd47fca95c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 26 Apr 2018 22:23:04 +0200
Subject: [PATCH 2/2] beam_validator: Verify Y registers in exception-causing
 instructions

When an exception is handled, the stack will be scanned. Therefore
all Y registers must be initialized.
---
 lib/compiler/src/beam_validator.erl        | 7 +++++++
 lib/compiler/test/beam_validator_SUITE.erl | 4 ++--
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index 962f17d83c..86aa12e19b 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -267,13 +267,17 @@ valfun_1(_I, #vst{current=none}=Vst) ->
     Vst;
 valfun_1({badmatch,Src}, Vst) ->
     assert_term(Src, Vst),
+    verify_y_init(Vst),
     kill_state(Vst);
 valfun_1({case_end,Src}, Vst) ->
     assert_term(Src, Vst),
+    verify_y_init(Vst),
     kill_state(Vst);
 valfun_1(if_end, Vst) ->
+    verify_y_init(Vst),
     kill_state(Vst);
 valfun_1({try_case_end,Src}, Vst) ->
+    verify_y_init(Vst),
     assert_term(Src, Vst),
     kill_state(Vst);
 %% Instructions that can not cause exceptions
@@ -375,6 +379,9 @@ valfun_1({call_ext,Live,Func}=I, Vst) ->
     case return_type(Func, Vst) of
 	exception ->
 	    verify_live(Live, Vst),
+            %% The stack will be scanned, so Y registers
+            %% must be initialized.
+            verify_y_init(Vst),
 	    kill_state(Vst);
 	_ ->
 	    valfun_2(I, Vst)
diff --git a/lib/compiler/test/beam_validator_SUITE.erl b/lib/compiler/test/beam_validator_SUITE.erl
index 3af71559ae..41f2957dc1 100644
--- a/lib/compiler/test/beam_validator_SUITE.erl
+++ b/lib/compiler/test/beam_validator_SUITE.erl
@@ -157,8 +157,8 @@ call_last(Config) when is_list(Config) ->
 merge_undefined(Config) when is_list(Config) ->
     Errors = do_val(merge_undefined, Config),
     [{{t,handle_call,2},
-      {{call_ext,2,{extfunc,debug,filter,2}},
-       22,
+      {{call_ext,1,{extfunc,erlang,exit,1}},
+       10,
        {uninitialized_reg,{y,0}}}}] = Errors,
     ok.
 
-- 
2.16.3

openSUSE Build Service is sponsored by