From 27ec2437fd240b10d0745256e813000b3d5d359a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 2 Mar 2017 17:55:15 +0900 Subject: Fix possible stack overflow for `method_missing`; fix #3478 Instead of shifting mruby VM stack, we always use CALL_MAXARGS. --- src/vm.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index c05afca9d..8c9a021aa 100644 --- a/src/vm.c +++ b/src/vm.c @@ -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 */ -- cgit v1.2.3