summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-02-24 14:28:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-02-24 14:28:14 +0900
commitd0bc006a739e5ee09ae00b09cda09902b1d71147 (patch)
tree8e40180b2bda2f56932bf481ebde6bb98fa5de61
parent44d8a40bac9b900b754bc78167939a74d5efd2d0 (diff)
parent42d23084b72541b74e9f4cc279afc5f89f89d4e1 (diff)
downloadmruby-d0bc006a739e5ee09ae00b09cda09902b1d71147.tar.gz
mruby-d0bc006a739e5ee09ae00b09cda09902b1d71147.zip
Merge pull request #2728 from govm/fix-dereference-invalid-argv
fix pointer dereference after realloc
-rw-r--r--src/vm.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index a03bcc17e..3734ccaf8 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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);