🐛 avoid overflow

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann
2026-05-20 22:08:45 +02:00
parent b3effb609c
commit 61f0d683e0
3 changed files with 18 additions and 6 deletions
@@ -128,7 +128,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
// first n-1 elements
@@ -201,7 +202,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
// first n-1 elements
@@ -262,7 +264,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
o->write_characters(indent_string.c_str(), new_indent);
+6 -3
View File
@@ -19302,7 +19302,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
// first n-1 elements
@@ -19375,7 +19376,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
// first n-1 elements
@@ -19436,7 +19438,8 @@ class serializer
const auto new_indent = current_indent + indent_step;
if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, indent_char);
indent_string.resize(std::max(indent_string.size() * 2, static_cast<std::size_t>(new_indent)), indent_char);
JSON_ASSERT(indent_string.size() >= new_indent);
}
o->write_characters(indent_string.c_str(), new_indent);
+6
View File
@@ -254,6 +254,8 @@ TEST_CASE("object inspection")
CHECK(j_array.dump(1024).size() == 25622);
// check if right indentation symbol is used
CHECK(j_array.dump(1024, '\t')[4096] == '\t');
// check resize is large enough
CHECK(j_array.dump(10000).size() == 250022);
}
SECTION("object")
@@ -263,6 +265,8 @@ TEST_CASE("object inspection")
CHECK(j_object.dump(1024).size() == 25642);
// check if right indentation symbol is used
CHECK(j_object.dump(1024, '\t')[4096] == '\t');
// check resize is large enough
CHECK(j_object.dump(10000).size() == 250042);
}
SECTION("binary")
@@ -271,6 +275,8 @@ TEST_CASE("object inspection")
// check right size after indentation triggering a resize
CHECK(j_binary.dump(1024).size() == 2086);
CHECK(j_binary.dump(1024, '\t')[1024] == '\t');
// check resize is large enough
CHECK(j_binary.dump(10000).size() == 20038);
}
}