diff options
author | Björn Gustavsson <[email protected]> | 2014-02-05 17:28:02 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-02-05 17:45:56 +0100 |
commit | 5f4b495e68de1d1762cad0a96d01b5195d3b458e (patch) | |
tree | 958127b54e582dc330ef1dde1ed0d859e734fc35 /lib/compiler/test/bs_match_SUITE.erl | |
parent | df4932103f0e7b848e094ed56b1fc042f896cf8f (diff) | |
download | otp-5f4b495e68de1d1762cad0a96d01b5195d3b458e.tar.gz otp-5f4b495e68de1d1762cad0a96d01b5195d3b458e.tar.bz2 otp-5f4b495e68de1d1762cad0a96d01b5195d3b458e.zip |
beam_bsm: Eliminate emulator crash when a binary is called
We must not do the delayed binary creation optimization if the
code attempts to call the matched out binary. Calling a matchstate
will crash the run-time system.
Reported-by: Loïc Hoguin
Diffstat (limited to 'lib/compiler/test/bs_match_SUITE.erl')
-rw-r--r-- | lib/compiler/test/bs_match_SUITE.erl | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl index 9f15845d33..149b9bbb8f 100644 --- a/lib/compiler/test/bs_match_SUITE.erl +++ b/lib/compiler/test/bs_match_SUITE.erl @@ -34,7 +34,7 @@ otp_7188/1,otp_7233/1,otp_7240/1,otp_7498/1, match_string/1,zero_width/1,bad_size/1,haystack/1, cover_beam_bool/1,matched_out_size/1,follow_fail_branch/1, - no_partition/1]). + no_partition/1,calling_a_binary/1]). -export([coverage_id/1,coverage_external_ignore/2]). @@ -59,7 +59,7 @@ groups() -> matching_and_andalso,otp_7188,otp_7233,otp_7240, otp_7498,match_string,zero_width,bad_size,haystack, cover_beam_bool,matched_out_size,follow_fail_branch, - no_partition]}]. + no_partition,calling_a_binary]}]. init_per_suite(Config) -> @@ -1178,6 +1178,17 @@ no_partition_2([], a5) -> no_partition_2(42.0, a6) -> six. +calling_a_binary(Config) when is_list(Config) -> + [] = call_binary(<<>>, []), + {'EXIT',{badarg,_}} = (catch call_binary(<<1>>, [])), + {'EXIT',{badarg,_}} = (catch call_binary(<<1,2,3>>, [])), + ok. + +call_binary(<<>>, Acc) -> + Acc; +call_binary(<<H,T/bits>>, Acc) -> + T(<<Acc/binary,H>>). + check(F, R) -> R = F(). |