diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-02 00:32:40 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-02 00:32:40 +0000 |
commit | b5fdd1bd76873fb0dbda439fdbaec2589b3c5e19 (patch) | |
tree | 678ed4b275c4b715a1cc3dfe561c74d3a4776049 /random.c | |
parent | cb355eebf06075f9f57ca8e8594355171cd17754 (diff) | |
download | ruby-b5fdd1bd76873fb0dbda439fdbaec2589b3c5e19.tar.gz |
* random.c (limited_big_rand): fix buffer overflow when SIZEOF_BDIGITS
is 2. fixed by Kenta Murata. [ruby-dev:33565]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -385,12 +385,16 @@ limited_big_rand(struct RBignum *limit) val = (struct RBignum *)rb_big_clone((VALUE)limit); RBIGNUM_SET_SIGN(val, 1); #if SIZEOF_BDIGITS == 2 -# define BIG_GET32(big,i) (RBIGNUM_DIGITS(big)[(i)*2] | \ - ((i)*2+1 < RBIGNUM_DIGITS(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] << 16) \ - : 0)) -# define BIG_SET32(big,i,d) ((RBIGNUM_DIGITS(big)[(i)*2] = (d) & 0xffff), \ - ((i)*2+1 < RBIGNUM_DIGITS(big) ? (RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) \ - : 0)) +# define BIG_GET32(big,i) \ + (RBIGNUM_DIGITS(big)[(i)*2] | \ + ((i)*2+1 < RBIGNUM_LEN(big) ? \ + (RBIGNUM_DIGITS(big)[(i)*2+1] << 16) : \ + 0)) +# define BIG_SET32(big,i,d) \ + ((RBIGNUM_DIGITS(big)[(i)*2] = (d) & 0xffff), \ + ((i)*2+1 < RBIGNUM_LEN(big) ? \ + (RBIGNUM_DIGITS(big)[(i)*2+1] = (d) >> 16) : \ + 0)) #else /* SIZEOF_BDIGITS == 4 */ # define BIG_GET32(big,i) (RBIGNUM_DIGITS(big)[i]) |