mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user