diff options
author | ll-antn <42381407+ll-antn@users.noreply.github.com> | 2019-03-04 22:35:10 +0300 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-03-04 11:35:10 -0800 |
commit | 1c7d91cc55a9deb05e7ea93ba10b5ab511d29238 (patch) | |
tree | 839ec52b514d769b48578b5a58a729d6ce8bb378 | |
parent | 2e865f4d4e67a9b628c137aab7da8140dd9339a4 (diff) | |
download | flatbuffers-1c7d91cc55a9deb05e7ea93ba10b5ab511d29238.tar.gz |
Clean-up nested_parser on all paths (#5179) (#5184)
* Clean-up nested_parser on all paths (#5179)
* Added test for parsing json with invalid nested flatbuffer
* Removed utf-8 BOM from test.cpp
-rw-r--r-- | src/idl_parser.cpp | 16 | ||||
-rw-r--r-- | tests/test.cpp | 21 |
2 files changed, 30 insertions, 7 deletions
diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index a9e207e2..3a8165fa 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -1216,8 +1216,15 @@ CheckedError Parser::ParseNestedFlatbuffer(Value &val, FieldDef *field, nested_parser.uses_flexbuffers_ = uses_flexbuffers_; // Parse JSON substring into new flatbuffer builder using nested_parser - if (!nested_parser.Parse(substring.c_str(), nullptr, nullptr)) { - ECHECK(Error(nested_parser.error_)); + bool ok = nested_parser.Parse(substring.c_str(), nullptr, nullptr); + + // Clean nested_parser to avoid deleting the elements in + // the SymbolTables on destruction + nested_parser.enums_.dict.clear(); + nested_parser.enums_.vec.clear(); + + if (!ok) { + ECHECK(Error(nested_parser.error_)); } // Force alignment for nested flatbuffer builder_.ForceVectorAlignment(nested_parser.builder_.GetSize(), sizeof(uint8_t), @@ -1226,11 +1233,6 @@ CheckedError Parser::ParseNestedFlatbuffer(Value &val, FieldDef *field, auto off = builder_.CreateVector(nested_parser.builder_.GetBufferPointer(), nested_parser.builder_.GetSize()); val.constant = NumToString(off.o); - - // Clean nested_parser before destruction to avoid deleting the elements in - // the SymbolTables - nested_parser.enums_.dict.clear(); - nested_parser.enums_.vec.clear(); } return NoError(); } diff --git a/tests/test.cpp b/tests/test.cpp index a18983f4..003f8255 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -1996,6 +1996,26 @@ void ParseUnionTest() { true); } +void InvalidNestedFlatbufferTest() { + // First, load and parse FlatBuffer schema (.fbs) + std::string schemafile; + TEST_EQ(flatbuffers::LoadFile((test_data_path + "monster_test.fbs").c_str(), + false, &schemafile), + true); + auto include_test_path = + flatbuffers::ConCatPathFileName(test_data_path, "include_test"); + const char *include_directories[] = { test_data_path.c_str(), + include_test_path.c_str(), nullptr }; + flatbuffers::Parser parser1; + TEST_EQ(parser1.Parse(schemafile.c_str(), include_directories), true); + + // "color" inside nested flatbuffer contains invalid enum value + TEST_EQ(parser1.Parse("{ name: \"Bender\", testnestedflatbuffer: { name: " + "\"Leela\", color: \"nonexistent\"}}"), + false); + // Check that Parser is destroyed correctly after parsing invalid json +} + void UnionVectorTest() { // load FlatBuffer fbs schema. // TODO: load a JSON file with such a vector when JSON support is ready. @@ -2524,6 +2544,7 @@ int FlatBufferTests() { InvalidUTF8Test(); UnknownFieldsTest(); ParseUnionTest(); + InvalidNestedFlatbufferTest(); ConformTest(); ParseProtoBufAsciiTest(); TypeAliasesTest(); |