From 7c481742f4d4d0674b01b02db0d03094e11c4356 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 22 Nov 2022 17:01:46 +0100 Subject: [PATCH] icinga2 daemon: w/o --dump-objects just check for circular refs and don't malloc() anything. --- lib/base/serializer.cpp | 6 ++++++ lib/base/serializer.hpp | 1 + lib/config/configitem.cpp | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) 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")); }