From b3effb609c99897d1a1e0ee1bcffca34c1820635 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 20 May 2026 21:56:32 +0200 Subject: [PATCH 1/3] :bug: use correct indentation character on resize Signed-off-by: Niels Lohmann --- include/nlohmann/detail/output/serializer.hpp | 6 ++-- single_include/nlohmann/json.hpp | 6 ++-- tests/src/unit-inspection.cpp | 29 +++++++++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index 25a64d6486..cdf0a9d7bc 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -128,7 +128,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } // first n-1 elements @@ -201,7 +201,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } // first n-1 elements @@ -262,7 +262,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } o->write_characters(indent_string.c_str(), new_indent); diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 2e16ad5b9e..3a7e6fbff9 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -19302,7 +19302,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } // first n-1 elements @@ -19375,7 +19375,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } // first n-1 elements @@ -19436,7 +19436,7 @@ 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_string.resize(indent_string.size() * 2, indent_char); } o->write_characters(indent_string.c_str(), new_indent); diff --git a/tests/src/unit-inspection.cpp b/tests/src/unit-inspection.cpp index c70913d5b1..9d6d06e231 100644 --- a/tests/src/unit-inspection.cpp +++ b/tests/src/unit-inspection.cpp @@ -245,6 +245,35 @@ TEST_CASE("object inspection") CHECK(binary.dump(1024).size() == 2086); } + SECTION("indentation and resize") + { + SECTION("array") + { + const auto j_array = "[[[[[[]]]]]]"_json; + // check right size after indentation triggering a resize + CHECK(j_array.dump(1024).size() == 25622); + // check if right indentation symbol is used + CHECK(j_array.dump(1024, '\t')[4096] == '\t'); + } + + SECTION("object") + { + const auto j_object = R"({"":{"":{"":{"":{"":{}}}}}})"_json; + // check right size after indentation triggering a resize + CHECK(j_object.dump(1024).size() == 25642); + // check if right indentation symbol is used + CHECK(j_object.dump(1024, '\t')[4096] == '\t'); + } + + SECTION("binary") + { + const auto j_binary = json::binary({1, 2, 3}, 128); + // check right size after indentation triggering a resize + CHECK(j_binary.dump(1024).size() == 2086); + CHECK(j_binary.dump(1024, '\t')[1024] == '\t'); + } + } + SECTION("dump and floating-point numbers") { auto s = json(42.23).dump(); From 61f0d683e047746d714adaf1d11d6736ee0c304b Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Wed, 20 May 2026 22:08:45 +0200 Subject: [PATCH 2/3] :bug: avoid overflow Signed-off-by: Niels Lohmann --- include/nlohmann/detail/output/serializer.hpp | 9 ++++++--- single_include/nlohmann/json.hpp | 9 ++++++--- tests/src/unit-inspection.cpp | 6 ++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index cdf0a9d7bc..6e75aff438 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -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(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(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(new_indent)), indent_char); + JSON_ASSERT(indent_string.size() >= new_indent); } o->write_characters(indent_string.c_str(), new_indent); diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 3a7e6fbff9..663883b127 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -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(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(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(new_indent)), indent_char); + JSON_ASSERT(indent_string.size() >= new_indent); } o->write_characters(indent_string.c_str(), new_indent); diff --git a/tests/src/unit-inspection.cpp b/tests/src/unit-inspection.cpp index 9d6d06e231..83349484ea 100644 --- a/tests/src/unit-inspection.cpp +++ b/tests/src/unit-inspection.cpp @@ -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); } } From 3249b180cc1f664eb668877cdef18bf513ee1109 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 21 May 2026 08:31:03 +0200 Subject: [PATCH 3/3] :rotating_light: fix compilation Signed-off-by: Niels Lohmann --- include/nlohmann/detail/output/serializer.hpp | 6 +++--- single_include/nlohmann/json.hpp | 6 +++--- tests/src/unit-inspection.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/detail/output/serializer.hpp b/include/nlohmann/detail/output/serializer.hpp index 6e75aff438..9dabecfd93 100644 --- a/include/nlohmann/detail/output/serializer.hpp +++ b/include/nlohmann/detail/output/serializer.hpp @@ -128,7 +128,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } @@ -202,7 +202,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } @@ -264,7 +264,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 663883b127..662c9afb0a 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -19302,7 +19302,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } @@ -19376,7 +19376,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } @@ -19438,7 +19438,7 @@ class serializer const auto new_indent = current_indent + indent_step; if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) { - indent_string.resize(std::max(indent_string.size() * 2, static_cast(new_indent)), indent_char); + indent_string.resize((std::max)(indent_string.size() * 2, static_cast(new_indent)), indent_char); JSON_ASSERT(indent_string.size() >= new_indent); } diff --git a/tests/src/unit-inspection.cpp b/tests/src/unit-inspection.cpp index 83349484ea..d79764bffd 100644 --- a/tests/src/unit-inspection.cpp +++ b/tests/src/unit-inspection.cpp @@ -249,7 +249,7 @@ TEST_CASE("object inspection") { SECTION("array") { - const auto j_array = "[[[[[[]]]]]]"_json; + const auto j_array = json::parse("[[[[[[]]]]]]"); // check right size after indentation triggering a resize CHECK(j_array.dump(1024).size() == 25622); // check if right indentation symbol is used @@ -260,7 +260,7 @@ TEST_CASE("object inspection") SECTION("object") { - const auto j_object = R"({"":{"":{"":{"":{"":{}}}}}})"_json; + const auto j_object = json::parse(R"({"":{"":{"":{"":{"":{}}}}}})"); // check right size after indentation triggering a resize CHECK(j_object.dump(1024).size() == 25642); // check if right indentation symbol is used