summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-06-27 22:29:24 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-06-27 22:43:37 +0900
commit1a3b32343ed9ebf287ae5a0f241877728e62bea5 (patch)
tree50915f2f90bf6839f7e8db3ef7a613db17bc6423 /src/class.c
parentb30eba6a13fef8994a7556654b5d4e3e54622f65 (diff)
downloadmruby-1a3b32343ed9ebf287ae5a0f241877728e62bea5.tar.gz
mruby-1a3b32343ed9ebf287ae5a0f241877728e62bea5.zip
Copy argv from VM stack to avoid use-after-free; fix #3722
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c
index 0eea9b4dc..99ad14d81 100644
--- a/src/class.c
+++ b/src/class.c
@@ -902,7 +902,9 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
if (argc > i) {
*pl = argc-i;
if (*pl > 0) {
- *var = ARGV + arg_i;
+ mrb_value args = mrb_ary_new_from_values(mrb, *pl, ARGV+arg_i);
+ RARRAY(args)->c = NULL;
+ *var = (mrb_value*)RARRAY_PTR(args);
}
i = argc;
arg_i += *pl;