From c7262be0aeaf55b5c92b26db82c08f2fe6b95412 Mon Sep 17 00:00:00 2001 From: Bouke van der Bijl Date: Wed, 23 Nov 2016 11:21:14 -0500 Subject: Fix segfault in Array#sample --- mrbgems/mruby-random/src/random.c | 3 ++- mrbgems/mruby-random/test/random.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-random') diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index 3b8d0dd2f..587e6c01a 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -266,7 +266,7 @@ mrb_ary_sample(mrb_state *mrb, mrb_value ary) mrb_int n = 0; mrb_bool given; mt_state *random = NULL; - mrb_int len = RARRAY_LEN(ary); + mrb_int len; mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type); if (random == NULL) { @@ -274,6 +274,7 @@ mrb_ary_sample(mrb_state *mrb, mrb_value ary) } mrb_random_rand_seed(mrb, random); mt_rand(random); + len = RARRAY_LEN(ary); if (!given) { /* pick one element */ switch (len) { case 0: diff --git a/mrbgems/mruby-random/test/random.rb b/mrbgems/mruby-random/test/random.rb index 1653ae4a6..1c59be3a6 100644 --- a/mrbgems/mruby-random/test/random.rb +++ b/mrbgems/mruby-random/test/random.rb @@ -74,3 +74,15 @@ assert('Array#shuffle!(random)') do ary1 != [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] and 10.times { |x| ary1.include? x } and ary1 == ary2 end + +assert('Array#sample checks input length after reading arguments') do + $ary = [1, 2, 3] + class ArrayChange + def to_i + $ary << 4 + 4 + end + end + + assert_equal [1, 2, 3, 4], $ary.sample(ArrayChange.new).sort +end -- cgit v1.2.3 From a8ccda5692de601d014a942ee1ea2129388ce84c Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Thu, 2 Feb 2017 16:35:59 -0500 Subject: Fetch arguments earlier to avoid a crash. --- mrbgems/mruby-random/src/random.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'mrbgems/mruby-random') diff --git a/mrbgems/mruby-random/src/random.c b/mrbgems/mruby-random/src/random.c index 587e6c01a..f81d38fe6 100644 --- a/mrbgems/mruby-random/src/random.c +++ b/mrbgems/mruby-random/src/random.c @@ -124,6 +124,8 @@ mrb_random_init(mrb_state *mrb, mrb_value self) mrb_value seed; mt_state *t; + seed = get_opt(mrb); + /* avoid memory leaks */ t = (mt_state*)DATA_PTR(self); if (t) { @@ -134,7 +136,6 @@ mrb_random_init(mrb_state *mrb, mrb_value self) t = (mt_state *)mrb_malloc(mrb, sizeof(mt_state)); t->mti = N + 1; - seed = get_opt(mrb); seed = mrb_random_mt_srand(mrb, t, seed); if (mrb_nil_p(seed)) { t->has_seed = FALSE; -- cgit v1.2.3