From 74f362f24b9d7c2bef4169519a47462ba96442ca Mon Sep 17 00:00:00 2001 From: Jordan Bayles Date: Sat, 14 Mar 2026 22:47:07 -0700 Subject: [PATCH 1/2] Change stack depth limit to 256 --- src/lib_json/json_reader.cpp | 8 ++++---- src/test_lib_json/main.cpp | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp index 265b03054..0697132b0 100644 --- a/src/lib_json/json_reader.cpp +++ b/src/lib_json/json_reader.cpp @@ -39,7 +39,7 @@ // Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile // time to change the stack limit #if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) -#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 +#define JSONCPP_DEPRECATED_STACK_LIMIT 256 #endif static size_t const stackLimit_g = @@ -1932,7 +1932,7 @@ void CharReaderBuilder::strictMode(Json::Value* settings) { (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; + (*settings)["stackLimit"] = 256; (*settings)["failIfExtra"] = true; (*settings)["rejectDupKeys"] = true; (*settings)["allowSpecialFloats"] = false; @@ -1949,7 +1949,7 @@ void CharReaderBuilder::setDefaults(Json::Value* settings) { (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; + (*settings)["stackLimit"] = 256; (*settings)["failIfExtra"] = false; (*settings)["rejectDupKeys"] = false; (*settings)["allowSpecialFloats"] = false; @@ -1965,7 +1965,7 @@ void CharReaderBuilder::ecma404Mode(Json::Value* settings) { (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; + (*settings)["stackLimit"] = 256; (*settings)["failIfExtra"] = true; (*settings)["rejectDupKeys"] = false; (*settings)["allowSpecialFloats"] = false; diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 5d5b971f8..cf267d8c2 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -3355,6 +3355,17 @@ JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithStackLimit) { JSONTEST_ASSERT_THROWS( reader->parse(doc, doc + std::strlen(doc), &root, &errs)); } + // Default stack limit should reject deeply nested input (regression test for + // stack exhaustion from fuzz input like [[[[...]]]]) + { + Json::CharReaderBuilder defaultBuilder; + Json::String nested(300, '['); + CharReaderPtr reader(defaultBuilder.newCharReader()); + Json::String errs; + JSONTEST_ASSERT_THROWS( + reader->parse(nested.data(), nested.data() + nested.size(), &root, + &errs)); + } #endif // JSON_USE_EXCEPTION } From 37dc7559a8cc9fa00e42dc59d9961bd63047aa27 Mon Sep 17 00:00:00 2001 From: Jordan Bayles Date: Sat, 14 Mar 2026 22:55:51 -0700 Subject: [PATCH 2/2] run clang format --- src/test_lib_json/main.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index cf267d8c2..f19ca2fb4 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -3362,9 +3362,8 @@ JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithStackLimit) { Json::String nested(300, '['); CharReaderPtr reader(defaultBuilder.newCharReader()); Json::String errs; - JSONTEST_ASSERT_THROWS( - reader->parse(nested.data(), nested.data() + nested.size(), &root, - &errs)); + JSONTEST_ASSERT_THROWS(reader->parse( + nested.data(), nested.data() + nested.size(), &root, &errs)); } #endif // JSON_USE_EXCEPTION