diff options
| author | Clayton Smith <[email protected]> | 2016-12-15 09:36:22 -0500 |
|---|---|---|
| committer | Clayton Smith <[email protected]> | 2016-12-15 09:36:22 -0500 |
| commit | 868d2e528fce86f380a2d099877f6cb8ffd1ff69 (patch) | |
| tree | 617a933cf0a26f6b5b688172e09dcc236f1b27d8 | |
| parent | 73cc08772f1a11140b238525698bce0664326a50 (diff) | |
| download | mruby-868d2e528fce86f380a2d099877f6cb8ffd1ff69.tar.gz mruby-868d2e528fce86f380a2d099877f6cb8ffd1ff69.zip | |
Fix crash when exponent is -2147483648
| -rw-r--r-- | src/string.c | 9 | ||||
| -rw-r--r-- | test/t/string.rb | 4 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/string.c b/src/string.c index 0049fdd5b..ce27cdaa1 100644 --- a/src/string.c +++ b/src/string.c @@ -2868,7 +2868,11 @@ mrb_float_read(const char *string, char **endPtr) mantSize -= 1; /* One of the digits was the point. */ } if (mantSize > 18) { - fracExp = decPt - 18; + if (decPt - 18 > 29999) { + fracExp = 29999; + } else { + fracExp = decPt - 18; + } mantSize = 18; } else { fracExp = decPt - mantSize; @@ -2922,6 +2926,9 @@ mrb_float_read(const char *string, char **endPtr) } while (isdigit(*p)) { exp = exp * 10 + (*p - '0'); + if (exp > 19999) { + exp = 19999; + } p += 1; } } diff --git a/test/t/string.rb b/test/t/string.rb index 80fcbe6fa..20dc49d92 100644 --- a/test/t/string.rb +++ b/test/t/string.rb @@ -596,10 +596,14 @@ assert('String#to_f', '15.2.10.5.38') do a = ''.to_f b = '123456789'.to_f c = '12345.6789'.to_f + d = '1e-2147483648'.to_f + e = '1e2147483648'.to_f assert_float(0.0, a) assert_float(123456789.0, b) assert_float(12345.6789, c) + assert_float(0, d) + assert_float(Float::INFINITY, e) end assert('String#to_i', '15.2.10.5.39') do |
