diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-14 00:46:21 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-14 00:46:21 +0900 |
| commit | edb5b3672ba1261c0421b77f96d12062c771154b (patch) | |
| tree | 6452a78a6dfa98ce6561055f672bc5f11bb30525 /src | |
| parent | b9f771dc50653451d945154671f529903a329033 (diff) | |
| download | mruby-edb5b3672ba1261c0421b77f96d12062c771154b.tar.gz mruby-edb5b3672ba1261c0421b77f96d12062c771154b.zip | |
Avoid out-of-bound access of VM stack in OP_SENDB; fix #3692
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 7 |
1 files changed, 3 insertions, 4 deletions
@@ -1245,6 +1245,7 @@ RETRY_TRY_BLOCK: mrb_value recv, result; mrb_sym mid = syms[GETARG_B(i)]; int bidx; + mrb_value blk; recv = regs[a]; if (n == CALL_MAXARGS) { @@ -1259,6 +1260,7 @@ RETRY_TRY_BLOCK: mrb->c->ci->nregs = bidx+1; } SET_NIL_VALUE(regs[bidx]); + SET_NIL_VALUE(blk); } else { mrb_value blk = regs[bidx]; @@ -1268,7 +1270,7 @@ RETRY_TRY_BLOCK: mrb->c->ci->nregs = bidx+1; } result = mrb_convert_type(mrb, blk, MRB_TT_PROC, "Proc", "to_proc"); - regs[bidx] = result; + blk = regs[bidx] = result; } } c = mrb_class(mrb, recv); @@ -1331,9 +1333,6 @@ RETRY_TRY_BLOCK: if (mrb->exc) goto L_RAISE; ci = mrb->c->ci; if (GET_OPCODE(i) == OP_SENDB) { - mrb_value blk; - - blk = ci->stackent[bidx]; if (mrb_type(blk) == MRB_TT_PROC) { struct RProc *p = mrb_proc_ptr(blk); |
