From: Michael Friedrich Date: Fri, 6 Jun 2014 11:30:06 +0000 (+0200) Subject: Fix segfault with zones without endpoints on config compile. X-Git-Tag: v2.0.0~71 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=78e4b28006f01a8be819577bfc3aaa3bb20f60fe;p=icinga2 Fix segfault with zones without endpoints on config compile. Fixes #6425 --- diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp index eb50fcec1..b34740f8f 100644 --- a/lib/remote/endpoint.cpp +++ b/lib/remote/endpoint.cpp @@ -40,6 +40,9 @@ void Endpoint::OnConfigLoaded(void) BOOST_FOREACH(const Zone::Ptr& zone, DynamicType::GetObjects()) { const std::set members = zone->GetEndpoints(); + if (members.empty()) + continue; + if (members.find(GetSelf()) != members.end()) { if (m_Zone) BOOST_THROW_EXCEPTION(std::runtime_error("Endpoint '" + GetName() + "' is in more than one zone.")); diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp index ac73307c3..2dbe706d8 100644 --- a/lib/remote/zone.cpp +++ b/lib/remote/zone.cpp @@ -18,6 +18,7 @@ ******************************************************************************/ #include "remote/zone.hpp" +#include "base/objectlock.hpp" #include using namespace icinga; @@ -33,8 +34,20 @@ std::set Zone::GetEndpoints(void) const { std::set result; - BOOST_FOREACH(const String& endpoint, GetEndpointsRaw()) - result.insert(Endpoint::GetByName(endpoint)); + Array::Ptr endpoints = GetEndpointsRaw(); + + if (endpoints) { + ObjectLock olock(endpoints); + + BOOST_FOREACH(const String& name, endpoints) { + Endpoint::Ptr endpoint = Endpoint::GetByName(name); + + if (!endpoint) + continue; + + result.insert(endpoint); + } + } return result; }