* util.c (ruby_strtod): check integr overflow.

[ruby-dev:42180] #3789

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29186 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2010-09-06 00:46:48 +00:00
Родитель fab386fbff
Коммит 0ed5aee000
3 изменённых файлов: 17 добавлений и 6 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Mon Sep 6 09:44:50 2010 NARUSE, Yui <naruse@ruby-lang.org>
* util.c (ruby_strtod): check integr overflow.
[ruby-dev:42180] #3789
Mon Sep 6 06:17:21 2010 Tanaka Akira <akr@fsij.org>
* ext/pathname/pathname.c (path_readable_p): Pathname#readable?

Просмотреть файл

@ -448,6 +448,7 @@ class TestFloat < Test::Unit::TestCase
assert_raise(ArgumentError) { Float("1.0\x001") }
assert_equal(15.9375, Float('0xf.fp0'))
assert_raise(ArgumentError) { Float('0xf.fp') }
assert_equal(Float::INFINITY, Float('0xf.fp1000000000000000'))
assert_equal(1, suppress_warning {Float("1e10_00")}.infinite?)
assert_raise(TypeError) { Float(nil) }
o = Object.new

17
util.c
Просмотреть файл

@ -2143,12 +2143,17 @@ break2:
nd = 0;
c = *s;
if (c < '0' || '9' < c) goto ret0;
do {
nd *= 10;
nd += c;
nd -= '0';
c = *++s;
if (c < '0' || '9' < c) goto ret0;
do {
nd *= 10;
nd += c;
nd -= '0';
c = *++s;
/* Float("0x0."+("0"*267)+"1fp2095") */
if (abs(nd) > 2095) {
while ('0' <= c && c <= '9') c = *++s;
break;
}
} while ('0' <= c && c <= '9');
dval(rv) = ldexp(adj, nd * dsign);
}