From c354af888779c9038cedf64c1502574eb8b29399 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 24 May 2009 21:28:14 +0200 Subject: Fixed crash on whispering somebody a second time after closing the tab The tabs are referred to case-insentively, but the removal of references to deleted tabs was happening case-sensitively. This caused roaming pointers to stay around and get reused later, crashing the client. --- NEWS | 1 + src/gui/chat.cpp | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index ab8c1c15..0fda11ee 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ - Fixed a possible crash on logging in to the map server - Fixed the crash when shift-clicking an item in the inventory - Fixed a crash related to item links in the chat window +- Fixed a crash on whispering somebody again after closing their tab - Fixed lightspeed bug when stopping to attack - Fixed the -S/--home-dir command line option - Fixed Reset Windows to also reset the party window diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 414d1e02..73af83ff 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -292,7 +292,9 @@ void ChatWindow::addTab(ChatTab *tab) void ChatWindow::removeWhisper(const std::string &nick) { - mWhispers.erase(nick); + std::string tempNick = nick; + toLower(tempNick); + mWhispers.erase(tempNick); } void ChatWindow::chatInput(std::string &msg) @@ -444,12 +446,13 @@ void ChatWindow::whisper(const std::string &nick, std::string mes, bool own) if (tempNick.compare(playerName) == 0) return; - ChatTab *tab = mWhispers[tempNick]; + ChatTab *tab = 0; + TabMap::const_iterator i = mWhispers.find(tempNick); - if (!tab && config.getValue("whispertab", false)) - { + if (i != mWhispers.end()) + tab = i->second; + else if (config.getValue("whispertab", false)) tab = addWhisperTab(nick); - } if (tab) { @@ -480,10 +483,12 @@ ChatTab *ChatWindow::addWhisperTab(const std::string &nick, bool switchTo) toLower(playerName); toLower(tempNick); - if (mWhispers[tempNick] || tempNick.compare(playerName) == 0) + if (mWhispers.find(tempNick) != mWhispers.end() + || tempNick.compare(playerName) == 0) return NULL; - ChatTab *ret = mWhispers[tempNick] = new WhisperTab(nick); + ChatTab *ret = new WhisperTab(nick); + mWhispers[tempNick] = ret; if (switchTo) mChatTabs->setSelectedTab(ret); -- cgit v1.2.3-70-g09d2