Commit b52c2f91 authored by Ulf Hermann's avatar Ulf Hermann

QmlDebug: Avoid dangerous interactions with QPacketProtocol

After deleteLater() a QObject does have another chance to send more
signals. So, if we do that with the underlying QIODevice, we should
disconnect it from the debug connection (which then doesn't have a
QPacketProtocol anymore). Also, setting dev to 0 in QPacketProtocol is
an incredibly bad idea, as we never check it for 0. The only reason
this piece of code is never triggered is that we never generate
invalid packets on purpose.

Change-Id: I80e7f494bf55fa1a510b6f0bdd50cf45cae23734
Task-number: QTCREATORBUG-15496
Reviewed-by: default avatarJoerg Bornemann <>
parent 4e6d2a20
...@@ -115,6 +115,9 @@ void QmlDebugConnectionPrivate::disconnected() ...@@ -115,6 +115,9 @@ void QmlDebugConnectionPrivate::disconnected()
delete protocol; delete protocol;
protocol = 0; protocol = 0;
if (device) { if (device) {
// Don't allow any "connected()" or "disconnected()" signals to be triggered anymore.
// As the protocol is gone this would lead to crashes.
// Don't immediately delete it as it may do some cleanup on returning from a signal. // Don't immediately delete it as it may do some cleanup on returning from a signal.
device->deleteLater(); device->deleteLater();
device = 0; device = 0;
...@@ -174,7 +174,6 @@ public Q_SLOTS: ...@@ -174,7 +174,6 @@ public Q_SLOTS:
this, SLOT(aboutToClose())); this, SLOT(aboutToClose()));
QObject::disconnect(dev, SIGNAL(bytesWritten(qint64)), QObject::disconnect(dev, SIGNAL(bytesWritten(qint64)),
this, SLOT(bytesWritten(qint64))); this, SLOT(bytesWritten(qint64)));
dev = 0;
emit invalidPacket(); emit invalidPacket();
return; return;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment