From 4fe249280e04c62926c381c809ec8392cf8f3ebe Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 1 Oct 2014 20:28:59 +0200 Subject: [PATCH] Fix GetClients() const correctness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s dangerous to give a non-const reference to an internal container that the API users are not supposed to modify. --- include/znc/Client.h | 2 +- include/znc/IRCNetwork.h | 2 +- include/znc/User.h | 2 +- src/Chan.cpp | 4 ++-- src/Client.cpp | 8 ++++---- src/IRCNetwork.cpp | 2 +- src/IRCSock.cpp | 10 +++++----- src/User.cpp | 4 ++-- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/include/znc/Client.h b/include/znc/Client.h index 99ee9859..32fa1e2c 100644 --- a/include/znc/Client.h +++ b/include/znc/Client.h @@ -148,7 +148,7 @@ public: CUser* GetUser() const { return m_pUser; } void SetNetwork(CIRCNetwork* pNetwork, bool bDisconnect=true, bool bReconnect=true); CIRCNetwork* GetNetwork() const { return m_pNetwork; } - std::vector& GetClients(); + const std::vector& GetClients() const; const CIRCSock* GetIRCSock() const; CIRCSock* GetIRCSock(); CString GetFullName(); diff --git a/include/znc/IRCNetwork.h b/include/znc/IRCNetwork.h index ec4c6ff4..ad7bb122 100644 --- a/include/znc/IRCNetwork.h +++ b/include/znc/IRCNetwork.h @@ -74,7 +74,7 @@ public: CUser* GetUser(); const CString& GetName() const; bool IsNetworkAttached() const { return !m_vClients.empty(); } - std::vector& GetClients() { return m_vClients; } + const std::vector& GetClients() const { return m_vClients; } void SetUser(CUser *pUser); bool SetName(const CString& sName); diff --git a/include/znc/User.h b/include/znc/User.h index 588dce32..f0661ec7 100644 --- a/include/znc/User.h +++ b/include/znc/User.h @@ -141,8 +141,8 @@ public: // !Setters // Getters - std::vector& GetUserClients() { return m_vClients; } std::vector GetAllClients(); + const std::vector& GetUserClients() const { return m_vClients; } const CString& GetUserName() const; const CString& GetCleanUserName() const; const CString& GetNick(bool bAllowDefault = true) const; diff --git a/src/Chan.cpp b/src/Chan.cpp index b2ce8ba7..f962773c 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -141,8 +141,8 @@ void CChan::JoinUser(bool bForce, const CString& sKey, CClient* pClient) { CString sLine = sPre; CString sPerm, sNick; - vector& vpClients = m_pNetwork->GetClients(); - for (vector::iterator it = vpClients.begin(); it != vpClients.end(); ++it) { + const vector& vpClients = m_pNetwork->GetClients(); + for (vector::const_iterator it = vpClients.begin(); it != vpClients.end(); ++it) { CClient* pThisClient; if (!pClient) pThisClient = *it; diff --git a/src/Client.cpp b/src/Client.cpp index cc188b57..8c8603c2 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -271,7 +271,7 @@ void CClient::ReadLine(const CString& sData) { // Relay to the rest of the clients that may be connected to this user if (m_pNetwork->IsChan(sTarget)) { - vector& vClients = GetClients(); + const vector& vClients = GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { CClient* pClient = vClients[a]; @@ -325,7 +325,7 @@ void CClient::ReadLine(const CString& sData) { } // Relay to the rest of the clients that may be connected to this user - vector& vClients = GetClients(); + const vector& vClients = GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { CClient* pClient = vClients[a]; @@ -394,7 +394,7 @@ void CClient::ReadLine(const CString& sData) { // Relay to the rest of the clients that may be connected to this user if (m_pNetwork->IsChan(sTarget)) { - vector& vClients = GetClients(); + const vector& vClients = GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { CClient* pClient = vClients[a]; @@ -575,7 +575,7 @@ void CClient::SetNetwork(CIRCNetwork* pNetwork, bool bDisconnect, bool bReconnec } } -vector& CClient::GetClients() { +const vector& CClient::GetClients() const { if (m_pNetwork) { return m_pNetwork->GetClients(); } diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index 4739037d..9534261e 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -44,7 +44,7 @@ protected: pIRCSock->PutIRC("PING :ZNC"); } - vector& vClients = m_pNetwork->GetClients(); + const vector& vClients = m_pNetwork->GetClients(); for (size_t b = 0; b < vClients.size(); b++) { CClient* pClient = vClients[b]; diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index cbf88fd6..0fdde95d 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -181,7 +181,7 @@ void CIRCSock::ReadLine(const CString& sData) { m_bAuthed = true; m_pNetwork->PutStatus("Connected!"); - vector& vClients = m_pNetwork->GetClients(); + const vector& vClients = m_pNetwork->GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { CClient* pClient = vClients[a]; @@ -354,8 +354,8 @@ void CIRCSock::ReadLine(const CString& sData) { if (m_bNamesx && (sNick.size() > 1) && IsPermChar(sNick[1])) { // sLine uses multi-prefix - vector& vClients = m_pNetwork->GetClients(); - vector::iterator it; + const vector& vClients = m_pNetwork->GetClients(); + vector::const_iterator it; for (it = vClients.begin(); it != vClients.end(); ++it) { CClient *pClient = *it; @@ -1233,8 +1233,8 @@ CString CIRCSock::GetISupport(const CString& sKey, const CString& sDefault) cons } void CIRCSock::ForwardRaw353(const CString& sLine) const { - vector& vClients = m_pNetwork->GetClients(); - vector::iterator it; + const vector& vClients = m_pNetwork->GetClients(); + vector::const_iterator it; for (it = vClients.begin(); it != vClients.end(); ++it) { ForwardRaw353(sLine, *it); diff --git a/src/User.cpp b/src/User.cpp index f6fe9213..d348bdd2 100644 --- a/src/User.cpp +++ b/src/User.cpp @@ -37,7 +37,7 @@ public: private: protected: virtual void RunJob() { - vector& vUserClients = m_pUser->GetUserClients(); + const vector& vUserClients = m_pUser->GetUserClients(); for (size_t c = 0; c < vUserClients.size(); ++c) { CClient* pUserClient = vUserClients[c]; @@ -659,7 +659,7 @@ void CUser::CloneNetworks(const CUser& User) { // have requested the rehash. Then when we do // client->PutStatus("Rehashing succeeded!") we would // crash if there was no client anymore. - vector& vClients = FindNetwork(*it)->GetClients(); + const vector& vClients = FindNetwork(*it)->GetClients(); while (vClients.begin() != vClients.end()) { CClient *pClient = vClients.front();