From 8ffab186b4f13e38898984d475ee104fcc0d7ea7 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Thu, 6 Dec 2012 17:28:05 +0100 Subject: [PATCH] CModule::OnMode(): Fix a stupid NULL pointer dereference When joining a channel, OnMode() (via SetModes()) was called with pOpNick == NULL. This bad pointer was turned into a reference and given to modules. This bug exists since 2008 when the OnMode() module call was added. It wasn't noticed before because apparently no module used this CNick argument before. Signed-off-by: Uli Schlachter --- src/Chan.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Chan.cpp b/src/Chan.cpp index 4d496186..9c87a5ae 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -332,15 +332,17 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) { break; } - bool bNoChange; - if (bList) { - bNoChange = false; - } else if (bAdd) { - bNoChange = HasMode(uMode) && GetModeArg(uMode) == sArg; - } else { - bNoChange = !HasMode(uMode); + if (pOpNick) { + bool bNoChange; + if (bList) { + bNoChange = false; + } else if (bAdd) { + bNoChange = HasMode(uMode) && GetModeArg(uMode) == sArg; + } else { + bNoChange = !HasMode(uMode); + } + NETWORKMODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } - NETWORKMODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (!bList) { (bAdd) ? AddMode(uMode, sArg) : RemMode(uMode);