]> granicus.if.org Git - icinga2/commitdiff
Fix segfault with zones without endpoints on config compile.
authorMichael Friedrich <michael.friedrich@netways.de>
Fri, 6 Jun 2014 11:30:06 +0000 (13:30 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Fri, 6 Jun 2014 11:30:06 +0000 (13:30 +0200)
Fixes #6425

lib/remote/endpoint.cpp
lib/remote/zone.cpp

index eb50fcec1e15853959541898dbb076c95d8fa9b1..b34740f8fff6df62769af3e8995348850b822b3f 100644 (file)
@@ -40,6 +40,9 @@ void Endpoint::OnConfigLoaded(void)
        BOOST_FOREACH(const Zone::Ptr& zone, DynamicType::GetObjects<Zone>()) {
                const std::set<Endpoint::Ptr> 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."));
index ac73307c3d8c993ed4e7b9c260427dc883102188..2dbe706d8422664f4b3fb5321ab9446aced1f31f 100644 (file)
@@ -18,6 +18,7 @@
  ******************************************************************************/
 
 #include "remote/zone.hpp"
+#include "base/objectlock.hpp"
 #include <boost/foreach.hpp>
 
 using namespace icinga;
@@ -33,8 +34,20 @@ std::set<Endpoint::Ptr> Zone::GetEndpoints(void) const
 {
        std::set<Endpoint::Ptr> 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;
 }