From: Marcus Eggenberger Date: Fri, 3 Jun 2011 11:56:37 +0000 (+0200) Subject: Fixes #960 - "Core crashes after deleting a Network without disconnecting the Network... X-Git-Tag: 0.7.3~4 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=01e42adb4316fb0f5f1e7c1a6035ea5a2f3405cf;ds=sidebyside Fixes #960 - "Core crashes after deleting a Network without disconnecting the Network first" Note: this fixes the issue only in the 0.7 branch. Quassel Cores built from current git master will still crash. This is due to some unsave pointer handling in the new event system, which needs thorough fixing. --- diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 1c38a87a..c6774296 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -453,6 +453,9 @@ void CoreSession::removeNetwork(NetworkId id) { return; if(net->connectionState() != Network::Disconnected) { + // make sure we no longer receive data from the tcp buffer + disconnect(net, SIGNAL(displayMsg(NetworkId, Message::Type, BufferInfo::Type, const QString &, const QString &, const QString &, Message::Flags)), this, 0); + disconnect(net, SIGNAL(displayStatusMsg(QString)), this, 0); connect(net, SIGNAL(disconnected(NetworkId)), this, SLOT(destroyNetwork(NetworkId))); net->disconnectFromIrc(); } else { @@ -464,6 +467,16 @@ void CoreSession::destroyNetwork(NetworkId id) { QList removedBuffers = Core::requestBufferIdsForNetwork(user(), id); Network *net = _networks.take(id); if(net && Core::removeNetwork(user(), id)) { + // make sure that all unprocessed RawMessages from this network are removed + QList::iterator messageIter = _messageQueue.begin(); + while(messageIter != _messageQueue.end()) { + if(messageIter->networkId == id) { + messageIter = _messageQueue.erase(messageIter); + } else { + messageIter++; + } + } + // remove buffers from syncer foreach(BufferId bufferId, removedBuffers) { _bufferSyncer->removeBuffer(bufferId); }