summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-25 09:31:46 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-08-25 09:31:46 +0000
commitfd1022c065509846dd234914e3c9b725d20e928a (patch)
treeb9db58a6b8d6a0567a4daff22e538d77dfbc0e88 /random.c
parentae6a9009dcb5e475ef51a3448a613e7f4428855d (diff)
* 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
Diffstat (limited to 'random.c')
-rw-r--r--random.c14
1 files changed, 12 insertions, 2 deletions
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);
}