Fix possible stack overflow for method_missing; fix #3478

Instead of shifting mruby VM stack, we always use CALL_MAXARGS.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2017-03-02 17:55:15 +09:00
parent 0bcf9e28fc
commit 27ec2437fd
+5 -11
View File
@@ -1188,19 +1188,13 @@ RETRY_TRY_BLOCK:
mrb_method_missing(mrb, mid, recv, args);
}
mid = missing;
if (n == CALL_MAXARGS-1) {
if (n != CALL_MAXARGS) {
mrb_value blk = regs[bidx];
regs[a+1] = mrb_ary_new_from_values(mrb, n, regs+a+1);
SET_NIL_VALUE(regs[bidx]);
n++;
}
if (n == CALL_MAXARGS) {
mrb_ary_unshift(mrb, regs[a+1], sym);
}
else {
value_move(regs+a+2, regs+a+1, n+1);
regs[a+1] = sym;
n++;
regs[a+2] = blk;
n = CALL_MAXARGS;
}
mrb_ary_unshift(mrb, regs[a+1], sym);
}
/* push callinfo */