Prevent splicing big recursive arrrays; ref #3679

We know this is not perfect, but this change makes hack like #3679
bit harder. Harmless for useful cases.
parent b4a4e3c0
...@@ -620,7 +620,12 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val ...@@ -620,7 +620,12 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
argc = RARRAY_LEN(rpl); argc = RARRAY_LEN(rpl);
argv = RARRAY_PTR(rpl); argv = RARRAY_PTR(rpl);
if (argv == a->ptr) { if (argv == a->ptr) {
struct RArray *r = ary_dup(mrb, a); struct RArray *r;
if (argc > 32767) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "too big recursive splice");
}
r = ary_dup(mrb, a);
argv = r->ptr; argv = r->ptr;
} }
} }
......
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