* util.c (ruby_strtod): check there is at least 1 digit after

"0x" before ".". [ruby-dev:42183] #3790

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

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

@ -1,3 +1,8 @@
Mon Sep 6 09:47:24 2010 NARUSE, Yui <naruse@ruby-lang.org>
* util.c (ruby_strtod): check there is at least 1 digit after
"0x" before ".". [ruby-dev:42183] #3790
Mon Sep 6 09:44:50 2010 NARUSE, Yui <naruse@ruby-lang.org>
* util.c (ruby_strtod): check integr overflow.

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

@ -447,6 +447,7 @@ class TestFloat < Test::Unit::TestCase
assert(!Float(([1] * 10000).join("_")).infinite?) # is it really OK?
assert_raise(ArgumentError) { Float("1.0\x001") }
assert_equal(15.9375, Float('0xf.fp0'))
assert_raise(ArgumentError) { Float('0x') }
assert_raise(ArgumentError) { Float('0xf.fp') }
assert_equal(Float::INFINITY, Float('0xf.fp1000000000000000'))
assert_equal(1, suppress_warning {Float("1e10_00")}.infinite?)

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

@ -2123,10 +2123,11 @@ break2:
s0 = ++s;
adj = 0;
while (*++s && (s1 = strchr(hexdigit, *s))) {
if (!*++s || !(s1 = strchr(hexdigit, *s))) goto ret0;
do {
adj *= 16;
adj += (s1 - hexdigit) & 15;
}
} while (*++s && (s1 = strchr(hexdigit, *s)));
if (*s == '.') {
aadj = 1.;