diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-02-24 14:28:14 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-02-24 14:28:14 +0900 |
| commit | d0bc006a739e5ee09ae00b09cda09902b1d71147 (patch) | |
| tree | 8e40180b2bda2f56932bf481ebde6bb98fa5de61 /src | |
| parent | 44d8a40bac9b900b754bc78167939a74d5efd2d0 (diff) | |
| parent | 42d23084b72541b74e9f4cc279afc5f89f89d4e1 (diff) | |
| download | mruby-d0bc006a739e5ee09ae00b09cda09902b1d71147.tar.gz mruby-d0bc006a739e5ee09ae00b09cda09902b1d71147.zip | |
Merge pull request #2728 from govm/fix-dereference-invalid-argv
fix pointer dereference after realloc
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -340,6 +340,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc mrb_sym undef = 0; mrb_callinfo *ci; int n; + ptrdiff_t voff = -1; if (!mrb->c->stack) { stack_init(mrb); @@ -363,6 +364,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc ci->argc = argc; ci->target_class = c; mrb->c->stack = mrb->c->stack + n; + if (mrb->c->stbase <= argv && argv < mrb->c->stend) { + voff = argv - mrb->c->stbase; + } if (MRB_PROC_CFUNC_P(p)) { ci->nregs = argc + 2; stack_extend(mrb, ci->nregs, 0); @@ -371,6 +375,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc ci->nregs = p->body.irep->nregs + n; stack_extend(mrb, ci->nregs, argc+2); } + if (voff >= 0) { + argv = mrb->c->stbase + voff; + } mrb->c->stack[0] = self; if (undef) { mrb->c->stack[1] = mrb_symbol_value(undef); |
