summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-13 06:00:49 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-13 06:00:49 +0000
commit5d8c8b46bb763e2c4cdf68079b9eaede860be5b7 (patch)
tree78443a4f2573a2d43393e57262548a37973deae1 /random.c
parent5ee43b0a94d2743f97cdee5e83e6093243af7559 (diff)
* random.c (make_seed_value): fix leading-zero-guard condition on
bdigit is smaller than 32bit. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27328 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r--random.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/random.c b/random.c
index 149069c76e..3fee535e97 100644
--- a/random.c
+++ b/random.c
@@ -516,18 +516,25 @@ fill_random_seed(unsigned int seed[DEFAULT_SEED_CNT])
static VALUE
make_seed_value(const void *ptr)
{
+ const long len = DEFAULT_SEED_LEN/SIZEOF_BDIGITS;
BDIGIT *digits;
NEWOBJ(big, struct RBignum);
OBJSETUP(big, rb_cBignum, T_BIGNUM);
RBIGNUM_SET_SIGN(big, 1);
- rb_big_resize((VALUE)big, DEFAULT_SEED_LEN / SIZEOF_BDIGITS + 1);
+ rb_big_resize((VALUE)big, len + 1);
digits = RBIGNUM_DIGITS(big);
MEMCPY(digits, ptr, char, DEFAULT_SEED_LEN);
/* set leading-zero-guard if need. */
- digits[RBIGNUM_LEN(big)-1] = digits[RBIGNUM_LEN(big)-2] <= 1 ? 1 : 0;
+ digits[len] =
+#if SIZEOF_INT32 / SIZEOF_BDIGITS > 1
+ digits[len-2] <= 1 && digits[len-1] == 0
+#else
+ digits[len-1] <= 1
+#endif
+ ? 1 : 0;
return rb_big_norm((VALUE)big);
}