82 lines
2.8 KiB
Diff
82 lines
2.8 KiB
Diff
Index: yaml-cpp-yaml-cpp-0.6.1/src/singledocparser.cpp
|
|
===================================================================
|
|
--- yaml-cpp-yaml-cpp-0.6.1.orig/src/singledocparser.cpp
|
|
+++ yaml-cpp-yaml-cpp-0.6.1/src/singledocparser.cpp
|
|
@@ -46,6 +46,9 @@ void SingleDocParser::HandleDocument(Eve
|
|
}
|
|
|
|
void SingleDocParser::HandleNode(EventHandler& eventHandler) {
|
|
+ if (depth > depth_limit) {
|
|
+ throw ParserException(m_scanner.mark(), ErrorMsg::BAD_FILE);
|
|
+ }
|
|
// an empty node *is* a possibility
|
|
if (m_scanner.empty()) {
|
|
eventHandler.OnNull(m_scanner.mark(), NullAnchor);
|
|
@@ -57,9 +60,11 @@ void SingleDocParser::HandleNode(EventHa
|
|
|
|
// special case: a value node by itself must be a map, with no header
|
|
if (m_scanner.peek().type == Token::VALUE) {
|
|
+ depth++;
|
|
eventHandler.OnMapStart(mark, "?", NullAnchor, EmitterStyle::Default);
|
|
HandleMap(eventHandler);
|
|
eventHandler.OnMapEnd();
|
|
+ depth--;
|
|
return;
|
|
}
|
|
|
|
@@ -94,32 +99,42 @@ void SingleDocParser::HandleNode(EventHa
|
|
m_scanner.pop();
|
|
return;
|
|
case Token::FLOW_SEQ_START:
|
|
+ depth++;
|
|
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Flow);
|
|
HandleSequence(eventHandler);
|
|
eventHandler.OnSequenceEnd();
|
|
+ depth--;
|
|
return;
|
|
case Token::BLOCK_SEQ_START:
|
|
+ depth++;
|
|
eventHandler.OnSequenceStart(mark, tag, anchor, EmitterStyle::Block);
|
|
HandleSequence(eventHandler);
|
|
eventHandler.OnSequenceEnd();
|
|
+ depth--;
|
|
return;
|
|
case Token::FLOW_MAP_START:
|
|
+ depth++;
|
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
|
HandleMap(eventHandler);
|
|
eventHandler.OnMapEnd();
|
|
+ depth--;
|
|
return;
|
|
case Token::BLOCK_MAP_START:
|
|
+ depth++;
|
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Block);
|
|
HandleMap(eventHandler);
|
|
eventHandler.OnMapEnd();
|
|
+ depth--;
|
|
return;
|
|
case Token::KEY:
|
|
// compact maps can only go in a flow sequence
|
|
if (m_pCollectionStack->GetCurCollectionType() ==
|
|
CollectionType::FlowSeq) {
|
|
+ depth++;
|
|
eventHandler.OnMapStart(mark, tag, anchor, EmitterStyle::Flow);
|
|
HandleMap(eventHandler);
|
|
eventHandler.OnMapEnd();
|
|
+ depth--;
|
|
return;
|
|
}
|
|
break;
|
|
Index: yaml-cpp-yaml-cpp-0.6.1/src/singledocparser.h
|
|
===================================================================
|
|
--- yaml-cpp-yaml-cpp-0.6.1.orig/src/singledocparser.h
|
|
+++ yaml-cpp-yaml-cpp-0.6.1/src/singledocparser.h
|
|
@@ -51,6 +51,8 @@ class SingleDocParser : private noncopya
|
|
anchor_t LookupAnchor(const Mark& mark, const std::string& name) const;
|
|
|
|
private:
|
|
+ int depth = 0;
|
|
+ int depth_limit = 2048;
|
|
Scanner& m_scanner;
|
|
const Directives& m_directives;
|
|
std::unique_ptr<CollectionStack> m_pCollectionStack;
|