diff options
author | Björn Gustavsson <bjorn@erlang.org> | 2012-08-09 16:32:52 +0200 |
---|---|---|
committer | Björn Gustavsson <bjorn@erlang.org> | 2012-08-15 10:54:52 +0200 |
commit | 39608562fa4efdf4528a7cf3b9823cc84fa7946a (patch) | |
tree | 0c45fadc58d7b3f602cbcd680dfcdef474b8cb2c /lib | |
parent | f968ff87b1d6fb74237010bffa0390953337425e (diff) | |
download | otp-39608562fa4efdf4528a7cf3b9823cc84fa7946a.tar.gz otp-39608562fa4efdf4528a7cf3b9823cc84fa7946a.tar.bz2 otp-39608562fa4efdf4528a7cf3b9823cc84fa7946a.zip |
beam_validator: Validate the size operand in bs_init_bits and bs_init2
Diffstat (limited to 'lib')
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index a52e7bb761..9f0bca9dd5 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -783,15 +783,27 @@ valfun_4({bs_utf16_size,{f,Fail},A,Dst}, Vst) -> valfun_4({bs_bits_to_bytes,{f,Fail},Src,Dst}, Vst) -> assert_term(Src, Vst), set_type_reg({integer,[]}, Dst, branch_state(Fail, Vst)); -valfun_4({bs_init2,{f,Fail},_,Heap,Live,_,Dst}, Vst0) -> +valfun_4({bs_init2,{f,Fail},Sz,Heap,Live,_,Dst}, Vst0) -> verify_live(Live, Vst0), + if + is_integer(Sz) -> + ok; + true -> + assert_term(Sz, Vst0) + end, Vst1 = heap_alloc(Heap, Vst0), Vst2 = branch_state(Fail, Vst1), Vst3 = prune_x_regs(Live, Vst2), Vst = bs_zero_bits(Vst3), set_type_reg(binary, Dst, Vst); -valfun_4({bs_init_bits,{f,Fail},_,Heap,Live,_,Dst}, Vst0) -> +valfun_4({bs_init_bits,{f,Fail},Sz,Heap,Live,_,Dst}, Vst0) -> verify_live(Live, Vst0), + if + is_integer(Sz) -> + ok; + true -> + assert_term(Sz, Vst0) + end, Vst1 = heap_alloc(Heap, Vst0), Vst2 = branch_state(Fail, Vst1), Vst3 = prune_x_regs(Live, Vst2), |