-Fixed integer parsing overflow bug

This commit is contained in:
James Newton-King
2013-03-30 17:39:08 +13:00
parent 73187dde1e
commit bef6c4c11a
2 changed files with 19 additions and 13 deletions
@@ -1134,6 +1134,7 @@ bye", reader.Value);
Assert.AreEqual(int.MinValue, reader.ReadAsInt32());
reader = new JsonTextReader(new StringReader(long.MaxValue.ToString()));
ExceptionAssert.Throws<OverflowException>("Arithmetic operation resulted in an overflow.", () => reader.ReadAsInt32());
reader = new JsonTextReader(new StringReader("1E-06"));
ExceptionAssert.Throws<FormatException>("Input string was not in a correct format.", () => reader.ReadAsInt32());
+18 -13
View File
@@ -573,7 +573,7 @@ namespace Newtonsoft.Json.Utilities
if (isNegative)
{
// just a negative sign
// text just a negative sign
if (length == 1)
throw new FormatException("Input string was not in a correct format.");
@@ -581,22 +581,27 @@ namespace Newtonsoft.Json.Utilities
length--;
}
int result = 0;
int end = start + length;
for (int i = start; i < end; i++)
checked
{
char c = value[i];
int result = 0;
int end = start + length;
for (int i = start; i < end; i++)
{
char c = value[i];
if (!(c >= '0' && c <= '9'))
throw new FormatException("Input string was not in a correct format.");
if (c < '0' || c > '9')
throw new FormatException("Input string was not in a correct format.");
result = 10 * result + (c - 48);
result = 10*result + -(c - 48);
}
// go from negative to positive to avoids overflow
// negative can be slightly bigger than positive
if (!isNegative)
result = -result;
return result;
}
if (isNegative)
result = 0 - result;
return result;
}
}
}