Fix crash caused by repeated kicks of an already-kicked client
authorMichael Marley <michael@michaelmarley.com>
Wed, 9 May 2018 03:17:21 +0000 (23:17 -0400)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 6 Jun 2018 17:37:44 +0000 (19:37 +0200)
As it turns out, the QHash[] operator implicitly adds nullptrs to
the map when called with a nonexistent key.  If a user clicked the
button to kick another client multiple times, this would cause a
nullptr to be inserted into the peerMap, then causing a crash later
on at least when another client connected.  To solve the problem,
the value() method is used instead, which has no such side-effect.
A big thanks to @digitalcircuit for discovering this behavior.

src/common/signalproxy.cpp

index f344603..3ac73bc 100644 (file)
@@ -847,7 +847,10 @@ QVariantList SignalProxy::peerData() {
 }
 
 Peer *SignalProxy::peerById(int peerId) {
-    return _peerMap[peerId];
+    // We use ::value() here instead of the [] operator because the latter has the side-effect
+    // of automatically inserting a null value with the passed key into the map.  See
+    // https://doc.qt.io/qt-5/qhash.html#operator-5b-5d and https://doc.qt.io/qt-5/qhash.html#value.
+    return _peerMap.value(peerId);
 }
 
 void SignalProxy::restrictTargetPeers(QSet<Peer*> peers, std::function<void()> closure)