diff --git a/include/yaml-cpp/exceptions.h b/include/yaml-cpp/exceptions.h index 99e06b2..1c283a4 100644 --- a/include/yaml-cpp/exceptions.h +++ b/include/yaml-cpp/exceptions.h @@ -89,6 +89,7 @@ const char* const INVALID_ANCHOR = "invalid anchor"; const char* const INVALID_ALIAS = "invalid alias"; const char* const INVALID_TAG = "invalid tag"; const char* const BAD_FILE = "bad file"; +const char* const UNEXPECTED_TOKEN_AFTER_DOC = "unexpected token after end of document"; template inline const std::string KEY_NOT_FOUND_WITH_KEY( diff --git a/src/singledocparser.cpp b/src/singledocparser.cpp index 04ea4f2..c60a2e8 100644 --- a/src/singledocparser.cpp +++ b/src/singledocparser.cpp @@ -41,8 +41,13 @@ void SingleDocParser::HandleDocument(EventHandler& eventHandler) { eventHandler.OnDocumentEnd(); + // check if any tokens left after the text + if (!m_scanner.empty() && m_scanner.peek().type != Token::DOC_END + && m_scanner.peek().type != Token::DOC_START) + throw ParserException(m_scanner.mark(), ErrorMsg::UNEXPECTED_TOKEN_AFTER_DOC); + // and finally eat any doc ends we see - while (!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END) + if (!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END) m_scanner.pop(); } diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index 3aef8f8..19376a4 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -375,11 +375,21 @@ TEST(NodeTest, InfiniteLoopNodes) { EXPECT_THROW(LoadAll(R"(,)"), ParserException); } -TEST(NodeTest, MultipleDocuments) { +TEST(NodeTest, MultipleDocumentsBeginning) { std::vector docs = LoadAll("\n---\n---\nA\n"); EXPECT_EQ(docs.size(), 2); } +TEST(NodeTest, MultipleDocumentsEnds) { + std::vector docs = LoadAll("\n...\nA\n...\n"); + EXPECT_EQ(docs.size(), 2); +} + +TEST(NodeTest, MultipleDocumentsEndsWithEmptyDocs) { + std::vector docs = LoadAll("\n...\nA\n...\n...\nB\n..."); + EXPECT_EQ(docs.size(), 4); +} + struct NewLineStringsTestCase { std::string input; std::string expected_content; @@ -451,6 +461,10 @@ TEST(LoadNodeTest, BlockCREncoded) { EXPECT_EQ(1, node["followup"].as()); } +TEST(LoadNodeTest, IncorrectSeqEnd) { + EXPECT_THROW(Load("[foo]_bar"), ParserException); +} + } // namespace } // namespace YAML