summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--bignum.c6
2 files changed, 11 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c9a61e619..6183d05250 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Oct 27 18:50:17 2010 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * 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
+
Wed Oct 27 18:27:17 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* test/ruby/test_io.rb (TestIO#pipe): should close write end of pipe
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;