🐛 fixed integer overflow in dump function #1447

Closes #1447.
parent e17e0d03
...@@ -620,7 +620,7 @@ class serializer ...@@ -620,7 +620,7 @@ class serializer
if (is_negative) if (is_negative)
{ {
*buffer_ptr = '-'; *buffer_ptr = '-';
abs_value = static_cast<number_unsigned_t>(0 - x); abs_value = static_cast<number_unsigned_t>(-1 - x) + 1;
// account one more byte for the minus sign // account one more byte for the minus sign
n_chars = 1 + count_digits(abs_value); n_chars = 1 + count_digits(abs_value);
......
...@@ -11510,7 +11510,7 @@ class serializer ...@@ -11510,7 +11510,7 @@ class serializer
if (is_negative) if (is_negative)
{ {
*buffer_ptr = '-'; *buffer_ptr = '-';
abs_value = static_cast<number_unsigned_t>(0 - x); abs_value = static_cast<number_unsigned_t>(-1 - x) + 1;
// account one more byte for the minus sign // account one more byte for the minus sign
n_chars = 1 + count_digits(abs_value); n_chars = 1 + count_digits(abs_value);
......
...@@ -1742,7 +1742,8 @@ TEST_CASE("regression tests") ...@@ -1742,7 +1742,8 @@ TEST_CASE("regression tests")
SECTION("test case in issue #1445") SECTION("test case in issue #1445")
{ {
nlohmann::json dump_test; nlohmann::json dump_test;
const int data[] = { const int data[] =
{
109, 108, 103, 125, -122, -53, 115, 109, 108, 103, 125, -122, -53, 115,
18, 3, 0, 102, 19, 1, 15, 18, 3, 0, 102, 19, 1, 15,
-110, 13, -3, -1, -81, 32, 2, -110, 13, -3, -1, -81, 32, 2,
...@@ -1761,7 +1762,7 @@ TEST_CASE("regression tests") ...@@ -1761,7 +1762,7 @@ TEST_CASE("regression tests")
-54, -28, -26 -54, -28, -26
}; };
std::string s; std::string s;
for (int i=0; i<sizeof(data)/sizeof(int); i++) for (int i = 0; i < sizeof(data) / sizeof(int); i++)
{ {
s += static_cast<char>(data[i]); s += static_cast<char>(data[i]);
} }
...@@ -1769,6 +1770,12 @@ TEST_CASE("regression tests") ...@@ -1769,6 +1770,12 @@ TEST_CASE("regression tests")
dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace); dump_test.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace);
} }
} }
SECTION("issue #1447 - Integer Overflow (OSS-Fuzz 12506)")
{
json j = json::parse("[-9223372036854775808]");
CHECK(j.dump() == "[-9223372036854775808]");
}
} }
TEST_CASE("regression tests, exceptions dependent", "[!throws]") TEST_CASE("regression tests, exceptions dependent", "[!throws]")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment