From e4c501febbf9460ec24f90efb479deb5e68a2494 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 26 Nov 2016 20:15:05 +0300 Subject: crash fix for IRC kick/makeop commands --- protocols/IRCG/src/commandmonitor.cpp | 9 +++++---- protocols/IRCG/src/irclib.cpp | 10 ++-------- protocols/IRCG/src/services.cpp | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/protocols/IRCG/src/commandmonitor.cpp b/protocols/IRCG/src/commandmonitor.cpp index ecf55b4f83..26eaeebb80 100644 --- a/protocols/IRCG/src/commandmonitor.cpp +++ b/protocols/IRCG/src/commandmonitor.cpp @@ -408,7 +408,7 @@ bool CIrcProto::OnIrc_KICK(const CIrcMessage* pmsg) Chat_Control(m_szModuleName, S, SESSION_OFFLINE); if (m_rejoinIfKicked) { - CHANNELINFO *wi = (CHANNELINFO *)Chat_GetUserInfo(m_szModuleName, pmsg->parameters[0]); + CHANNELINFO *wi = (CHANNELINFO *)Chat_GetUserInfo(m_szModuleName, MakeWndID(pmsg->parameters[0])); if (wi && wi->pszPassword) PostIrcMessage(L"/JOIN %s %s", pmsg->parameters[0], wi->pszPassword); else @@ -492,7 +492,8 @@ bool CIrcProto::OnIrc_MODE(const CIrcMessage* pmsg) if ((int)pmsg->parameters.getCount() > iParametercount) { if (!mir_wstrcmp(pmsg->parameters[2], m_info.sNick)) { char cModeBit = -1; - CHANNELINFO *wi = (CHANNELINFO*)Chat_GetUserInfo(m_szModuleName, pmsg->parameters[0]); + CMStringW windowName = MakeWndID(pmsg->parameters[0]); + CHANNELINFO *wi = (CHANNELINFO*)Chat_GetUserInfo(m_szModuleName, windowName); switch (*p1) { case 'v': cModeBit = 0; break; case 'h': cModeBit = 1; break; @@ -502,14 +503,14 @@ bool CIrcProto::OnIrc_MODE(const CIrcMessage* pmsg) } // set bit for own mode on this channel (voice/hop/op/admin/owner) - if (cModeBit >= 0) { + if (wi && cModeBit >= 0) { if (bAdd) wi->OwnMode |= (1 << cModeBit); else wi->OwnMode &= ~(1 << cModeBit); } - Chat_SetUserInfo(m_szModuleName, pmsg->parameters[0], wi); + Chat_SetUserInfo(m_szModuleName, windowName, wi); } DoEvent(bAdd ? GC_EVENT_ADDSTATUS : GC_EVENT_REMOVESTATUS, pmsg->parameters[0], pmsg->parameters[iParametercount], pmsg->prefix.sNick, sStatus, NULL, NULL, m_oldStyleModes ? false : true, false); iParametercount++; diff --git a/protocols/IRCG/src/irclib.cpp b/protocols/IRCG/src/irclib.cpp index 36c9f09f40..d59717900a 100644 --- a/protocols/IRCG/src/irclib.cpp +++ b/protocols/IRCG/src/irclib.cpp @@ -658,14 +658,8 @@ void CIrcProto::OnIrcMessage(const CIrcMessage* pmsg) if (pfn) { // call member function. if it returns 'false', // call the default handling - __try { - if (!(this->*pfn)(pmsg)) - OnIrcDefault(pmsg); - } - __except (EXCEPTION_EXECUTE_HANDLER) // dedicated to Sava :) - { - debugLogA("IRC handler feels sick: %S", pmsg->sCommand.c_str()); - } + if (!(this->*pfn)(pmsg)) + OnIrcDefault(pmsg); } else // handler not found. call default handler OnIrcDefault(pmsg); diff --git a/protocols/IRCG/src/services.cpp b/protocols/IRCG/src/services.cpp index dc0b504209..ad3ef5605f 100644 --- a/protocols/IRCG/src/services.cpp +++ b/protocols/IRCG/src/services.cpp @@ -846,7 +846,7 @@ int __cdecl CIrcProto::GCMenuHook(WPARAM, LPARAM lParam) ulAdr = ConvertIPToInteger(m_IPFromServer ? m_myHost : m_myLocalHost); gcmi->Item[23].bDisabled = ulAdr == 0 ? TRUE : FALSE; // DCC submenu - CHANNELINFO *wi = (CHANNELINFO *)Chat_GetUserInfo(m_szModuleName, gcmi->pszID); + CHANNELINFO *wi = (CHANNELINFO *)Chat_GetUserInfo(m_szModuleName, MakeWndID(gcmi->pszID)); BOOL bServOwner = strchr(sUserModes.c_str(), 'q') == NULL ? FALSE : TRUE; BOOL bServAdmin = strchr(sUserModes.c_str(), 'a') == NULL ? FALSE : TRUE; BOOL bOwner = bServOwner ? ((wi->OwnMode >> 4) & 01) : FALSE; -- cgit v1.2.3