From 5cf605b1d2769239de77fe9836cbd320b4482257 Mon Sep 17 00:00:00 2001 From: usa Date: Wed, 27 Oct 2010 09:54:27 +0000 Subject: * bignum.c (rb_big2long, rb_big2ulong): rb2ulong() returns VALUE, but its real range is ulong. So, if the size of VALUE is bigger than ulong, upper bits are always zero even if the actual value is negative. fixed #3490 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29612 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- bignum.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'bignum.c') diff --git a/bignum.c b/bignum.c index 3145f24843..152018e981 100644 --- a/bignum.c +++ b/bignum.c @@ -1176,7 +1176,7 @@ rb_big2ulong(VALUE x) VALUE num = big2ulong(x, "unsigned long", TRUE); if (!RBIGNUM_SIGN(x)) { - if ((SIGNED_VALUE)num < 0) { + if ((long)num < 0) { rb_raise(rb_eRangeError, "bignum out of range of unsigned long"); } return (VALUE)(-(SIGNED_VALUE)num); @@ -1189,8 +1189,8 @@ rb_big2long(VALUE x) { VALUE num = big2ulong(x, "long", TRUE); - if ((SIGNED_VALUE)num < 0 && - (RBIGNUM_SIGN(x) || (SIGNED_VALUE)num != LONG_MIN)) { + if ((long)num < 0 && + (RBIGNUM_SIGN(x) || (long)num != LONG_MIN)) { rb_raise(rb_eRangeError, "bignum too big to convert into `long'"); } if (!RBIGNUM_SIGN(x)) return -(SIGNED_VALUE)num; -- cgit v1.2.3