[前][次][番号順一覧][スレッド一覧]

ruby-changes:1717

From: ko1@a...
Date: 22 Aug 2007 11:48:43 +0900
Subject: [ruby-changes:1717] shyouhei - Ruby:r13208 (ruby_1_8_6): * bignum.c (rb_big_aref): check for Bignum index range.

shyouhei	2007-08-22 11:48:36 +0900 (Wed, 22 Aug 2007)

  New Revision: 13208

  Modified files:
    branches/ruby_1_8_6/ChangeLog
    branches/ruby_1_8_6/bignum.c
    branches/ruby_1_8_6/version.h

  Log:
    * bignum.c (rb_big_aref): check for Bignum index range.
     [ruby-dev:31271]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=13208&r2=13207
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=13208&r2=13207
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/bignum.c?r1=13208&r2=13207

Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 13207)
+++ ruby_1_8_6/ChangeLog	(revision 13208)
@@ -1,3 +1,8 @@
+Wed Aug 22 11:47:11 2007  Nobuyoshi Nakada  <nobu@r...>
+
+	* bignum.c (rb_big_aref): check for Bignum index range.
+	 [ruby-dev:31271]
+
 Wed Aug 22 11:41:44 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* dln.c (conv_to_posix_path): removed.
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 13207)
+++ ruby_1_8_6/version.h	(revision 13208)
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2007-08-22"
 #define RUBY_VERSION_CODE 186
 #define RUBY_RELEASE_CODE 20070822
-#define RUBY_PATCHLEVEL 80
+#define RUBY_PATCHLEVEL 81
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
Index: ruby_1_8_6/bignum.c
===================================================================
--- ruby_1_8_6/bignum.c	(revision 13207)
+++ ruby_1_8_6/bignum.c	(revision 13208)
@@ -2049,29 +2049,39 @@
     VALUE x, y;
 {
     BDIGIT *xds;
-    int shift;
-    long s1, s2;
+    BDIGIT_DBL num;
+    unsigned long shift;
+    long i, s1, s2;
 
     if (TYPE(y) == T_BIGNUM) {
-	if (!RBIGNUM(y)->sign || RBIGNUM(x)->sign)
+	if (!RBIGNUM(y)->sign)
 	    return INT2FIX(0);
-	return INT2FIX(1);
+	if (RBIGNUM(bigtrunc(y))->len > SIZEOF_LONG/SIZEOF_BDIGITS) {
+	  out_of_range:
+	    return RBIGNUM(x)->sign ? INT2FIX(0) : INT2FIX(1);
+	}
+	shift = big2ulong(y, "long", Qfalse);
     }
-    shift = NUM2INT(y);
-    if (shift < 0) return INT2FIX(0);
+    else {
+	i = NUM2LONG(y);
+	if (i < 0) return INT2FIX(0);
+	shift = (VALUE)i;
+    }
     s1 = shift/BITSPERDIG;
     s2 = shift%BITSPERDIG;
 
+    if (s1 >= RBIGNUM(x)->len) goto out_of_range;
     if (!RBIGNUM(x)->sign) {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(1);
-	x = rb_big_clone(x);
-	get2comp(x);
+	xds = BDIGITS(x);
+	i = 0; num = 1;
+	while (num += ~xds[i], ++i <= s1) {
+	    num = BIGDN(num);
+	}
     }
     else {
-	if (s1 >= RBIGNUM(x)->len) return INT2FIX(0);
+	num = BDIGITS(x)[s1];
     }
-    xds = BDIGITS(x);
-    if (xds[s1] & (1<<s2))
+    if (num & ((BDIGIT_DBL)1<<s2))
 	return INT2FIX(1);
     return INT2FIX(0);
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]