From fd1022c065509846dd234914e3c9b725d20e928a Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 25 Aug 2010 09:31:46 +0000 Subject: * random.c (rb_random_real): check the range of result. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29094 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 +++- random.c | 14 ++++++++++++-- test/ruby/test_array.rb | 13 +++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index dcddf95751..641a0fad32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ -Wed Aug 25 17:59:50 2010 Nobuyoshi Nakada +Wed Aug 25 18:31:17 2010 Nobuyoshi Nakada + + * random.c (rb_random_real): check the range of result. * array.c (rb_ary_{shuffle_bang,sample}): use Random class object. diff --git a/random.c b/random.c index a822a23792..09dde25bc2 100644 --- a/random.c +++ b/random.c @@ -887,7 +887,13 @@ rb_random_int32(VALUE obj) { rb_random_t *rnd = try_get_rnd(obj); if (!rnd) { - VALUE lim = ULONG2NUM(0xffffffff); +#if SIZEOF_LONG > 32 + VALUE lim = ULONG2NUM(0x100000000); +#elif defined HAVE_LONG_LONG + VALUE lim = ULL2NUM((LONG_LONG)0xffffffff+1); +#else + VALUE lim = rb_big_plus(ULONG2NUM(0xffffffff), INT2FIX(1)); +#endif return NUM2ULONG(rb_funcall2(obj, id_rand, 1, &lim)); } return genrand_int32(&rnd->mt); @@ -899,7 +905,11 @@ rb_random_real(VALUE obj) rb_random_t *rnd = try_get_rnd(obj); if (!rnd) { VALUE v = rb_funcall2(obj, id_rand, 0, 0); - return NUM2DBL(v); + double d = NUM2DBL(v); + if (d < 0.0 || d >= 1.0) { + rb_raise(rb_eRangeError, "random number too big %g", d); + } + return d; } return genrand_real(&rnd->mt); } diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index f95d8870a1..4a8b700c77 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -1899,6 +1899,19 @@ class TestArray < Test::Unit::TestCase end end + def test_shuffle_random + cc = nil + gen = proc do + 10000000 + end + class << gen + alias rand call + end + assert_raise(RangeError) { + [*0..2].shuffle(random: gen) + } + end + def test_sample 100.times do assert([0, 1, 2].include?([2, 1, 0].sample)) -- cgit v1.2.3