From 8a99be082d384ecddebb5d484235a65e2cd4e7ad Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Wed, 18 Feb 2026 21:25:26 +0100 Subject: [PATCH 1/4] test: demonstrate error on multiple empty documents --- test/integration/load_node_test.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index 3aef8f8fa..9b17137ba 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; From e946e9d9db13ae89f6ae468358f793d7b511a520 Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Wed, 18 Feb 2026 21:25:54 +0100 Subject: [PATCH 2/4] fix: do not ignore empty documents --- src/singledocparser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/singledocparser.cpp b/src/singledocparser.cpp index 04ea4f287..29a62b836 100644 --- a/src/singledocparser.cpp +++ b/src/singledocparser.cpp @@ -42,7 +42,7 @@ void SingleDocParser::HandleDocument(EventHandler& eventHandler) { eventHandler.OnDocumentEnd(); // 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(); } From c605ace8db40edf65f4bea31bb984004a7378061 Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Wed, 18 Feb 2026 21:29:39 +0100 Subject: [PATCH 3/4] test: demonstrate faulty sequence ending --- test/integration/load_node_test.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index 9b17137ba..19376a430 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -461,6 +461,10 @@ TEST(LoadNodeTest, BlockCREncoded) { EXPECT_EQ(1, node["followup"].as()); } +TEST(LoadNodeTest, IncorrectSeqEnd) { + EXPECT_THROW(Load("[foo]_bar"), ParserException); +} + } // namespace } // namespace YAML From 5dea602eaeb103e49e5badf4b0e92394f2b1a6b6 Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Wed, 18 Feb 2026 21:30:07 +0100 Subject: [PATCH 4/4] fix: docs must end with ..., --- or EOF --- include/yaml-cpp/exceptions.h | 1 + src/singledocparser.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/yaml-cpp/exceptions.h b/include/yaml-cpp/exceptions.h index 99e06b24e..1c283a405 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 29a62b836..c60a2e8b5 100644 --- a/src/singledocparser.cpp +++ b/src/singledocparser.cpp @@ -41,6 +41,11 @@ 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 if (!m_scanner.empty() && m_scanner.peek().type == Token::DOC_END) m_scanner.pop();