Fixes #960 - "Core crashes after deleting a Network without disconnecting the Network...
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 3 Jun 2011 11:56:37 +0000 (13:56 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Fri, 3 Jun 2011 11:56:37 +0000 (13:56 +0200)
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.

src/core/coresession.cpp

index 1c38a87..c677429 100644 (file)
@@ -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<BufferId> 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<RawMessage>::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);
     }