De-serialization of Decimal not always overflowing when it should (#1668)
This commit is contained in:
committed by
James Newton-King
parent
4c4d870816
commit
94a4dbf7fe
@@ -233,6 +233,8 @@ namespace Newtonsoft.Json.Tests.Utilities
|
||||
|
||||
AssertDecimalTryParse("1E+29", ParseResult.Overflow, null);
|
||||
AssertDecimalTryParse("-1E+29", ParseResult.Overflow, null);
|
||||
AssertDecimalTryParse("79228162514264337593543950336", ParseResult.Overflow, null); // decimal.MaxValue + 1
|
||||
AssertDecimalTryParse("-79228162514264337593543950336", ParseResult.Overflow, null); // decimal.MinValue - 1
|
||||
|
||||
AssertDecimalTryParse("1-1", ParseResult.Invalid, null);
|
||||
AssertDecimalTryParse("1-", ParseResult.Invalid, null);
|
||||
|
||||
@@ -1334,7 +1334,7 @@ namespace Newtonsoft.Json.Utilities
|
||||
ulong lo10 = 0UL;
|
||||
int mantissaDigits = 0;
|
||||
int exponentFromMantissa = 0;
|
||||
bool? roundUp = null;
|
||||
char? digit29 = null;
|
||||
bool? storeOnly28Digits = null;
|
||||
for (; i < end; i++)
|
||||
{
|
||||
@@ -1455,9 +1455,9 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!roundUp.HasValue)
|
||||
if (!digit29.HasValue)
|
||||
{
|
||||
roundUp = c >= '5';
|
||||
digit29 = c;
|
||||
}
|
||||
++exponentFromMantissa;
|
||||
}
|
||||
@@ -1496,6 +1496,10 @@ namespace Newtonsoft.Json.Utilities
|
||||
return ParseResult.Overflow;
|
||||
}
|
||||
}
|
||||
else if (value == decimalMaxValueHi28 && digit29 > decimalMaxValueLo1)
|
||||
{
|
||||
return ParseResult.Overflow;
|
||||
}
|
||||
value *= 10M;
|
||||
}
|
||||
else
|
||||
@@ -1505,7 +1509,7 @@ namespace Newtonsoft.Json.Utilities
|
||||
}
|
||||
else
|
||||
{
|
||||
if (roundUp == true && exponent >= -28)
|
||||
if (digit29 >= '5' && exponent >= -28)
|
||||
{
|
||||
++value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user