diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 8e22ed397..388c7697c 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -5,6 +5,7 @@ bin_PROGRAMS += zcash-gtest zcash_gtest_SOURCES = \ gtest/main.cpp \ gtest/json_test_vectors.cpp \ + gtest/test_jsonspirit.cpp \ gtest/test_tautology.cpp \ gtest/test_checktransaction.cpp \ gtest/test_equihash.cpp \ diff --git a/src/gtest/test_jsonspirit.cpp b/src/gtest/test_jsonspirit.cpp new file mode 100644 index 000000000..f93e8d459 --- /dev/null +++ b/src/gtest/test_jsonspirit.cpp @@ -0,0 +1,17 @@ +#include + +#include "json/json_spirit_reader_template.h" + +using namespace json_spirit; + +// This test checks if we have fixed a stack overflow problem with json_spirit. +// It was possible to try and create an unlimited number of nested compound elements. +// Without the fix in json_spirit_reader_template.h, this test will segfault. +TEST(json_spirit_tests, nested_input_segfault) { + std::vector v (100000); + std::fill (v.begin(),v.end(), '['); + std::string s(v.begin(), v.end()); + Value value; + bool b = json_spirit::read_string(s, value); + ASSERT_FALSE(b); +} diff --git a/src/json/json_spirit_reader_template.h b/src/json/json_spirit_reader_template.h index 47e3c1ca8..2e3d21e90 100644 --- a/src/json/json_spirit_reader_template.h +++ b/src/json/json_spirit_reader_template.h @@ -308,6 +308,12 @@ namespace json_spirit } else { + // ZCASH: Prevent potential stack overflow by setting a limit on the number of nested compound elements + if (stack_.size() > 128) { + throw "too many nested elements"; + } + // ENDZCASH + stack_.push_back( current_p_ ); Array_or_obj new_array_or_obj; // avoid copy by building new array or object in place