Commit d0bc006a authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #2728 from govm/fix-dereference-invalid-argv

fix pointer dereference after realloc
parents 44d8a40b 42d23084
...@@ -340,6 +340,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc ...@@ -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_sym undef = 0;
mrb_callinfo *ci; mrb_callinfo *ci;
int n; int n;
ptrdiff_t voff = -1;
if (!mrb->c->stack) { if (!mrb->c->stack) {
stack_init(mrb); stack_init(mrb);
...@@ -363,6 +364,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc ...@@ -363,6 +364,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
ci->argc = argc; ci->argc = argc;
ci->target_class = c; ci->target_class = c;
mrb->c->stack = mrb->c->stack + n; 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)) { if (MRB_PROC_CFUNC_P(p)) {
ci->nregs = argc + 2; ci->nregs = argc + 2;
stack_extend(mrb, ci->nregs, 0); 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 ...@@ -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; ci->nregs = p->body.irep->nregs + n;
stack_extend(mrb, ci->nregs, argc+2); stack_extend(mrb, ci->nregs, argc+2);
} }
if (voff >= 0) {
argv = mrb->c->stbase + voff;
}
mrb->c->stack[0] = self; mrb->c->stack[0] = self;
if (undef) { if (undef) {
mrb->c->stack[1] = mrb_symbol_value(undef); mrb->c->stack[1] = mrb_symbol_value(undef);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment