From 5d8c8b46bb763e2c4cdf68079b9eaede860be5b7 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 13 Apr 2010 06:00:49 +0000 Subject: * 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 --- ChangeLog | 5 +++++ random.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f36e3726a0..f83502684f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Apr 13 15:00:45 2010 Nobuyoshi Nakada + + * random.c (make_seed_value): fix leading-zero-guard condition on + bdigit is smaller than 32bit. + Tue Apr 13 13:57:36 2010 Keiju Ishitsuka * lib/irb/completion.rb (CompletionProc): fix [ruby-dev:40953] 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); } -- cgit v1.2.3