From 434231f530d4d10d897d0764731db620a4d7f660 Mon Sep 17 00:00:00 2001 From: psychon Date: Sun, 28 Oct 2007 18:11:44 +0000 Subject: [PATCH] Fix a mem leak in ZNC core CUser::DelChan() didn't actually delete anything, so if you joined much... well git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@856 726aef4b-f618-498e-8847-2d620e286838 --- IRCSock.cpp | 12 +++++++++++- User.cpp | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/IRCSock.cpp b/IRCSock.cpp index f79e9ecd..b6f38670 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -511,9 +511,13 @@ void CIRCSock::ReadLine(const CString& sData) { } CChan* pChan = m_pUser->FindChan(sChan); + bool bDetached = false; if (pChan) { pChan->RemNick(Nick.GetNick()); MODULECALL(OnPart(Nick.GetNickMask(), *pChan), m_pUser, NULL, ); + + if (pChan->IsDetached()) + bDetached = true; } // Todo: use nick compare function @@ -521,7 +525,13 @@ void CIRCSock::ReadLine(const CString& sData) { m_pUser->DelChan(sChan); } - if ((pChan) && (pChan->IsDetached())) { + /* + * We use this boolean because + * m_pUser->DelChan() will delete this channel + * and thus we would dereference an + * already-freed pointer! + */ + if (bDetached) { return; } } else if (sCmd.CaseCmp("MODE") == 0) { diff --git a/User.cpp b/User.cpp index 210b24f0..f043ac87 100644 --- a/User.cpp +++ b/User.cpp @@ -509,6 +509,7 @@ bool CUser::AddChan(const CString& sName, bool bInConfig) { bool CUser::DelChan(const CString& sName) { for (vector::iterator a = m_vChans.begin(); a != m_vChans.end(); a++) { if (sName.CaseCmp((*a)->GetName()) == 0) { + delete *a; m_vChans.erase(a); return true; }