Merge pull request #390 from qwename/integer-overflow
🔀 fix issue #380: Signed integer overflow check
This commit is contained in:
commit
4e2fb1a533
2 changed files with 12 additions and 12 deletions
12
src/json.hpp
12
src/json.hpp
|
@ -10619,19 +10619,19 @@ basic_json_parser_66:
|
||||||
// skip if definitely not an integer
|
// skip if definitely not an integer
|
||||||
if (type != value_t::number_float)
|
if (type != value_t::number_float)
|
||||||
{
|
{
|
||||||
// multiply last value by ten and add the new digit
|
auto digit = static_cast<number_unsigned_t>(*curptr - '0');
|
||||||
auto temp = value * 10 + *curptr - '0';
|
|
||||||
|
|
||||||
// test for overflow
|
// overflow if value * 10 + digit > max, move terms around
|
||||||
if (temp < value || temp > max)
|
// to avoid overflow in intermediate values
|
||||||
|
if (value > (max - digit) / 10)
|
||||||
{
|
{
|
||||||
// overflow
|
// overflow
|
||||||
type = value_t::number_float;
|
type = value_t::number_float;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no overflow - save it
|
// no overflow
|
||||||
value = temp;
|
value = value * 10 + digit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9769,19 +9769,19 @@ class basic_json
|
||||||
// skip if definitely not an integer
|
// skip if definitely not an integer
|
||||||
if (type != value_t::number_float)
|
if (type != value_t::number_float)
|
||||||
{
|
{
|
||||||
// multiply last value by ten and add the new digit
|
auto digit = static_cast<number_unsigned_t>(*curptr - '0');
|
||||||
auto temp = value * 10 + *curptr - '0';
|
|
||||||
|
|
||||||
// test for overflow
|
// overflow if value * 10 + digit > max, move terms around
|
||||||
if (temp < value || temp > max)
|
// to avoid overflow in intermediate values
|
||||||
|
if (value > (max - digit) / 10)
|
||||||
{
|
{
|
||||||
// overflow
|
// overflow
|
||||||
type = value_t::number_float;
|
type = value_t::number_float;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no overflow - save it
|
// no overflow
|
||||||
value = temp;
|
value = value * 10 + digit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue