diff --git a/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs b/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs index 37e4b0b3..b2163a97 100644 --- a/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs +++ b/Src/Newtonsoft.Json.Tests/Utilities/ConvertUtilsTests.cs @@ -125,6 +125,10 @@ namespace Newtonsoft.Json.Tests.Utilities AssertDoubleTryParse("1.7976931348623159E+308", ParseResult.Overflow, null); AssertDoubleTryParse("-1.7976931348623159E+308", ParseResult.Overflow, null); + + AssertDoubleTryParse("1E4294967297", ParseResult.Overflow, null); + AssertDoubleTryParse("1E4294967297B", ParseResult.Invalid, null); + AssertDoubleTryParse("1E-4294967297", ParseResult.Success, 0); } [Test] diff --git a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs index 6790c5e6..a711a227 100644 --- a/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ConvertUtils.cs @@ -997,7 +997,6 @@ namespace Newtonsoft.Json.Utilities int numDecimalStart = end; int numDecimalEnd = end; int exponent = 0; - bool exponentNegative = false; ulong mantissa = 0UL; int mantissaDigits = 0; int exponentFromMantissa = 0; @@ -1043,6 +1042,7 @@ namespace Newtonsoft.Json.Utilities } c = chars[i]; + bool exponentNegative = false; switch (c) { case '-': @@ -1055,28 +1055,26 @@ namespace Newtonsoft.Json.Utilities } // parse 3 digit - for (;i < end;i++) + for (; i < end; i++) { c = chars[i]; if (c < '0' || c > '9') { return ParseResult.Invalid; } - - exponent = (10 * exponent) + (c - '0'); + + var newExponent = (10 * exponent) + (c - '0'); + // stops updating exponent when overflowing + if (exponent < newExponent) + { + exponent = newExponent; + } } if (exponentNegative) { exponent = -exponent; } - else - { - if (exponent > MaxExponent) - { - return ParseResult.Overflow; - } - } break; default: if (c < '0' || c > '9') @@ -1102,9 +1100,16 @@ namespace Newtonsoft.Json.Utilities // correct the decimal point exponent -= (numDecimalEnd - numDecimalStart); + if (exponent > MaxExponent) + { + return ParseResult.Overflow; + } + + value = mantissa; + if (exponent > 0) { - value = mantissa * DoubleExponents[exponent - 1]; + value *= DoubleExponents[exponent - 1]; } else if (exponent < 0) { @@ -1112,26 +1117,17 @@ namespace Newtonsoft.Json.Utilities if (exponent > MaxExponent) { // handle very small numbers, e.g. 4.94065645841247E-324 - value = mantissa * DoubleNegativeExponents[154 - 1]; exponent -= 154; - } - else - { - value = mantissa; - } - - if (DoubleNegativeExponents.Length <= exponent - 1) - { - value = 0; - return ParseResult.Success; + if (DoubleNegativeExponents.Length <= exponent - 1) + { + value = 0D; + return ParseResult.Success; + } + value *= DoubleNegativeExponents[154 - 1]; } value = exponent < 23 ? value / DoubleExponents[exponent - 1] : value * DoubleNegativeExponents[exponent - 1]; } - else - { - value = mantissa; - } if (double.IsPositiveInfinity(value)) {