Fix segfault on method call with exactly 127 arguments

Reported by https://hackerone.com/dkasak
parent a630c4f4
...@@ -772,6 +772,8 @@ attrsym(codegen_scope *s, mrb_sym a) ...@@ -772,6 +772,8 @@ attrsym(codegen_scope *s, mrb_sym a)
return mrb_intern(s->mrb, name2, len+1); return mrb_intern(s->mrb, name2, len+1);
} }
#define CALL_MAXARGS 127
static int static int
gen_values(codegen_scope *s, node *t, int val) gen_values(codegen_scope *s, node *t, int val)
{ {
...@@ -780,7 +782,9 @@ gen_values(codegen_scope *s, node *t, int val) ...@@ -780,7 +782,9 @@ gen_values(codegen_scope *s, node *t, int val)
while (t) { while (t) {
is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */ is_splat = (intptr_t)t->car->car == NODE_SPLAT; /* splat mode */
if (n >= 127 || is_splat) { if (
n >= CALL_MAXARGS - 1 /* need to subtract one because vm.c expects an array if n == CALL_MAXARGS */
|| is_splat) {
if (val) { if (val) {
if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) { if (is_splat && n == 0 && (intptr_t)t->car->cdr->car == NODE_ARRAY) {
codegen(s, t->car->cdr, VAL); codegen(s, t->car->cdr, VAL);
...@@ -831,8 +835,6 @@ gen_values(codegen_scope *s, node *t, int val) ...@@ -831,8 +835,6 @@ gen_values(codegen_scope *s, node *t, int val)
return n; return n;
} }
#define CALL_MAXARGS 127
static void static void
gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe) gen_call(codegen_scope *s, node *tree, mrb_sym name, int sp, int val, int safe)
{ {
......
##
# Codegen tests
assert('method call with exactly 127 arguments') do
def args_to_ary(*args)
args
end
assert_equal [0]*127, args_to_ary(
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, \
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
)
end
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