diff options
author | innokentii <[email protected]> | 2023-03-23 17:02:27 +0300 |
---|---|---|
committer | innokentii <[email protected]> | 2023-03-23 17:02:27 +0300 |
commit | 1b63dc868aaa1066fd2f723f739ea086a2a49601 (patch) | |
tree | f317d82984b0facf4a5d81720e5bb54cf9a124d4 /library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp | |
parent | 8007028c9d3043fe9909990721048e49127eeeec (diff) |
Fix leaks on fyamlcpp misuse
fix possible leaks on misuse
Diffstat (limited to 'library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp')
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp index 94093c4157b..ffe1d4368c3 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp +++ b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp @@ -86,4 +86,71 @@ test: b auto docOpt3 = parser.NextDocument(); UNIT_ASSERT(!docOpt3); } + + Y_UNIT_TEST(Leak) { + std::optional<NFyaml::TDocument> doc; + + { + std::optional<NFyaml::TDocument> item1; + std::optional<NFyaml::TDocument> item2; + { + const TString items = R"( +item: + x: 1 + y: 2 +--- +test: + a: noop + b: + - 1 + - 2 + - 3 +--- +x: b +)"; + auto parser = NFyaml::TParser::Create(items); + + item1.emplace(*parser.NextDocument()); + item2.emplace(*parser.NextDocument()); + parser.NextDocument(); + parser.NextDocument(); + } + + { + const TString config = R"( +test: a +--- +test: [] +--- +x: b +)"; + auto parser = NFyaml::TParser::Create(config); + + parser.NextDocument(); + doc.emplace(*parser.NextDocument()); + parser.NextDocument(); + parser.NextDocument(); + } + + { + auto item1NodeRef = item1->Root().Map().at("item"); + auto item2NodeRef = item2->Root().Map().at("test"); + auto docNodeRef = doc->Root().Map().at("test"); + auto node1 = item1NodeRef.Copy(*doc); + auto node2 = item2NodeRef.Copy(*doc); + docNodeRef.Sequence().Append(node1.Ref()); + docNodeRef.Sequence().Append(node2.Ref()); + item1.reset(); + item2.reset(); + } + } + + auto seq = doc->Root().Map().at("test").Sequence(); + UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("x").Scalar(), "1"); + UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("y").Scalar(), "2"); + UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("a").Scalar(), "noop"); + UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(0).Scalar(), "1"); + UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(1).Scalar(), "2"); + UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(2).Scalar(), "3"); + } } |