diff --git a/fix-node-regression.patch b/fix-node-regression.patch new file mode 100644 index 0000000..faa5a7d --- /dev/null +++ b/fix-node-regression.patch @@ -0,0 +1,119 @@ +From b426fafff6238dda8d86fa668f585cba732dd272 Mon Sep 17 00:00:00 2001 +From: Jonathan Hamilton +Date: Mon, 1 Jun 2015 13:33:59 -0700 +Subject: [PATCH] Fix some Node::operator[] regressions from 0.5.1 + +"const Node Node::operator[](const Key& key) const" changed from +returning new empty node if the key was missing in 0.5.1 to returning +a shared 'zombie' node in 0.5.2 to resolve a memory leak. + +(Specifically 1025f76df1b32b6ec3571ca928d7797a768a3341 was where this +was introduced) + +This caused some regressions where this 'zombie' object threw exceptions +in some functions where the 'empty' object would not. + +This change fixes the Node::as(fallback) method (to return the +'fallback' instead of throwing an exception) and the +Node::begin()/Node::end() methods to return default-constructed +iterators (so begin() == end() in such cases) instead of another +exception. +--- + include/yaml-cpp/node/impl.h | 10 +++++----- + test/node/node_test.cpp | 32 ++++++++++++++++++++++++++++++++ + 2 files changed, 37 insertions(+), 5 deletions(-) + +diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h +index 26cccbd..69db1b7 100644 +--- a/include/yaml-cpp/node/impl.h ++++ b/include/yaml-cpp/node/impl.h +@@ -149,7 +149,7 @@ inline const T Node::as() const { + template + inline const T Node::as(const S& fallback) const { + if (!m_isValid) +- throw InvalidNode(); ++ return fallback; + return as_if(*this)(fallback); + } + +@@ -282,26 +282,26 @@ inline std::size_t Node::size() const { + + inline const_iterator Node::begin() const { + if (!m_isValid) +- throw InvalidNode(); ++ return const_iterator(); + return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory) + : const_iterator(); + } + + inline iterator Node::begin() { + if (!m_isValid) +- throw InvalidNode(); ++ return iterator(); + return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator(); + } + + inline const_iterator Node::end() const { + if (!m_isValid) +- throw InvalidNode(); ++ return const_iterator(); + return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator(); + } + + inline iterator Node::end() { + if (!m_isValid) +- throw InvalidNode(); ++ return iterator(); + return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator(); + } + +diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp +index 03ad782..b00c69d 100644 +--- a/test/node/node_test.cpp ++++ b/test/node/node_test.cpp +@@ -80,6 +80,12 @@ TEST(NodeTest, MapWithUndefinedValues) { + EXPECT_EQ(2, node.size()); + } + ++TEST(NodeTest, UndefinedConstNodeWithFallback) { ++ Node node; ++ const Node& cn = node; ++ EXPECT_EQ(cn["undefined"].as(3), 3); ++} ++ + TEST(NodeTest, MapIteratorWithUndefinedValues) { + Node node; + node["key"] = "value"; +@@ -91,6 +97,32 @@ TEST(NodeTest, MapIteratorWithUndefinedValues) { + EXPECT_EQ(1, count); + } + ++TEST(NodeTest, ConstIteratorOnConstUndefinedNode) { ++ Node node; ++ const Node& cn = node; ++ const Node& undefinedCn = cn["undefined"]; ++ ++ std::size_t count = 0; ++ for (const_iterator it = undefinedCn.begin(); it != undefinedCn.end(); ++it) { ++ count++; ++ } ++ EXPECT_EQ(0, count); ++} ++ ++TEST(NodeTest, IteratorOnConstUndefinedNode) { ++ Node node; ++ const Node& cn = node; ++ const Node& undefinedCn = cn["undefined"]; ++ ++ Node& nonConstUndefinedNode = const_cast(undefinedCn); ++ ++ std::size_t count = 0; ++ for (iterator it = nonConstUndefinedNode.begin(); it != nonConstUndefinedNode.end(); ++it) { ++ count++; ++ } ++ EXPECT_EQ(0, count); ++} ++ + TEST(NodeTest, SimpleSubkeys) { + Node node; + node["device"]["udid"] = "12345"; diff --git a/yaml-cpp.changes b/yaml-cpp.changes index 3314882..0b8aad3 100644 --- a/yaml-cpp.changes +++ b/yaml-cpp.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Fri Nov 13 09:51:23 UTC 2015 - tchvatal@suse.com + +- Add patch to fix wrong node behaviour in 0.5.2 bnc#954749: + * fix-node-regression.patch + ------------------------------------------------------------------- Sat Aug 1 18:08:00 UTC 2015 - rpm@fthiessen.de diff --git a/yaml-cpp.spec b/yaml-cpp.spec index 7788901..a038a6d 100644 --- a/yaml-cpp.spec +++ b/yaml-cpp.spec @@ -26,6 +26,7 @@ License: MIT Group: Development/Libraries/C and C++ Url: https://github.com/jbeder/yaml-cpp/ Source: https://github.com/jbeder/yaml-cpp/archive/release-%{version}/%{name}-%{version}.tar.gz +Patch0: fix-node-regression.patch BuildRequires: boost-devel BuildRequires: cmake BuildRequires: gcc @@ -55,6 +56,7 @@ Development files for %{name} library. %prep %setup -qn %{name}-release-%{version} +%patch0 -p1 %build %cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ../