diff --git a/lib/base/serializer.cpp b/lib/base/serializer.cpp index dc6069e97..c3bd84ad1 100644 --- a/lib/base/serializer.cpp +++ b/lib/base/serializer.cpp @@ -291,6 +291,12 @@ static Value SerializeInternal(const Value& value, int attributeTypes, Serialize return SerializeObject(input, attributeTypes, stack, dryRun); } +void icinga::AssertNoCircularReferences(const Value& value) +{ + SerializeStack stack; + SerializeInternal(value, FAConfig, stack, true); +} + Value icinga::Serialize(const Value& value, int attributeTypes) { SerializeStack stack; diff --git a/lib/base/serializer.hpp b/lib/base/serializer.hpp index 77b31cecc..f055b3bc7 100644 --- a/lib/base/serializer.hpp +++ b/lib/base/serializer.hpp @@ -24,6 +24,7 @@ private: std::vector m_Path; }; +void AssertNoCircularReferences(const Value& value); Value Serialize(const Value& value, int attributeTypes = FAState); Value Deserialize(const Value& value, bool safe_mode = false, int attributeTypes = FAState); Value Deserialize(const Object::Ptr& object, const Value& value, bool safe_mode = false, int attributeTypes = FAState); diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index d188d3042..82303b421 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -281,7 +281,11 @@ ConfigObject::Ptr ConfigItem::Commit(bool discard) Value serializedObject; try { - serializedObject = Serialize(dobj, FAConfig); + if (ConfigCompilerContext::GetInstance()->IsOpen()) { + serializedObject = Serialize(dobj, FAConfig); + } else { + AssertNoCircularReferences(dobj); + } } catch (const CircularReferenceError& ex) { BOOST_THROW_EXCEPTION(ValidationError(dobj, ex.GetPath(), "Circular references are not allowed")); }