From 2b6529c424de931551582ca91b1ddfd0645298dc Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 11 Mar 2014 10:40:37 +0100 Subject: [PATCH] Fix {Host,Service,User}Group::{Add,Remove}Member isn't thread-safe. Fixes #5699 --- lib/icinga/hostgroup.cpp | 3 +++ lib/icinga/hostgroup.h | 1 + lib/icinga/servicegroup.cpp | 3 +++ lib/icinga/servicegroup.h | 1 + lib/icinga/usergroup.cpp | 3 +++ lib/icinga/usergroup.h | 1 + 6 files changed, 12 insertions(+) diff --git a/lib/icinga/hostgroup.cpp b/lib/icinga/hostgroup.cpp index a029f57a8..03859f798 100644 --- a/lib/icinga/hostgroup.cpp +++ b/lib/icinga/hostgroup.cpp @@ -31,15 +31,18 @@ REGISTER_TYPE(HostGroup); std::set HostGroup::GetMembers(void) const { + boost::mutex::scoped_lock lock(m_HostGroupMutex); return m_Members; } void HostGroup::AddMember(const Host::Ptr& host) { + boost::mutex::scoped_lock lock(m_HostGroupMutex); m_Members.insert(host); } void HostGroup::RemoveMember(const Host::Ptr& host) { + boost::mutex::scoped_lock lock(m_HostGroupMutex); m_Members.erase(host); } diff --git a/lib/icinga/hostgroup.h b/lib/icinga/hostgroup.h index abe42cdaf..82b29eef7 100644 --- a/lib/icinga/hostgroup.h +++ b/lib/icinga/hostgroup.h @@ -43,6 +43,7 @@ public: void RemoveMember(const Host::Ptr& host); private: + mutable boost::mutex m_HostGroupMutex; std::set m_Members; }; diff --git a/lib/icinga/servicegroup.cpp b/lib/icinga/servicegroup.cpp index fedfe6f0f..5752aab0d 100644 --- a/lib/icinga/servicegroup.cpp +++ b/lib/icinga/servicegroup.cpp @@ -32,15 +32,18 @@ REGISTER_TYPE(ServiceGroup); std::set ServiceGroup::GetMembers(void) const { + boost::mutex::scoped_lock lock(m_ServiceGroupMutex); return m_Members; } void ServiceGroup::AddMember(const Service::Ptr& service) { + boost::mutex::scoped_lock lock(m_ServiceGroupMutex); m_Members.insert(service); } void ServiceGroup::RemoveMember(const Service::Ptr& service) { + boost::mutex::scoped_lock lock(m_ServiceGroupMutex); m_Members.erase(service); } diff --git a/lib/icinga/servicegroup.h b/lib/icinga/servicegroup.h index 0ee2fbfae..1bb5a2b60 100644 --- a/lib/icinga/servicegroup.h +++ b/lib/icinga/servicegroup.h @@ -43,6 +43,7 @@ public: void RemoveMember(const Service::Ptr& service); private: + mutable boost::mutex m_ServiceGroupMutex; std::set m_Members; }; diff --git a/lib/icinga/usergroup.cpp b/lib/icinga/usergroup.cpp index 8233bed05..b5d3db24e 100644 --- a/lib/icinga/usergroup.cpp +++ b/lib/icinga/usergroup.cpp @@ -31,15 +31,18 @@ REGISTER_TYPE(UserGroup); std::set UserGroup::GetMembers(void) const { + boost::mutex::scoped_lock lock(m_UserGroupMutex); return m_Members; } void UserGroup::AddMember(const User::Ptr& user) { + boost::mutex::scoped_lock lock(m_UserGroupMutex); m_Members.insert(user); } void UserGroup::RemoveMember(const User::Ptr& user) { + boost::mutex::scoped_lock lock(m_UserGroupMutex); m_Members.erase(user); } diff --git a/lib/icinga/usergroup.h b/lib/icinga/usergroup.h index e7b1566ff..5834fa9a2 100644 --- a/lib/icinga/usergroup.h +++ b/lib/icinga/usergroup.h @@ -43,6 +43,7 @@ public: void RemoveMember(const User::Ptr& user); private: + mutable boost::mutex m_UserGroupMutex; std::set m_Members; }; -- 2.40.0