summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2016-11-26 20:15:05 +0300
committerGeorge Hazan <ghazan@miranda.im>2016-11-26 20:15:05 +0300
commite4c501febbf9460ec24f90efb479deb5e68a2494 (patch)
treefd10ba01480f248fd10d4d8aff8df10577631852
parentd5960ef7a6e6764fd33e473ecd12a819e172dcef (diff)
crash fix for IRC kick/makeop commands
-rw-r--r--protocols/IRCG/src/commandmonitor.cpp9
-rw-r--r--protocols/IRCG/src/irclib.cpp10
-rw-r--r--protocols/IRCG/src/services.cpp2
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;