From 1620aa041f1cce7e55177457e1901d410e9a9f6f Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 15 May 2025 13:03:08 +0200 Subject: [PATCH] QmlDesigner: prevent crash on cleared connection Change-Id: I3bc0e656ed0682a759e49d60772a233bf33fba66 Reviewed-by: Tim Jenssen --- .../instances/connectionmanager.cpp | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmldesigner/instances/connectionmanager.cpp b/src/plugins/qmldesigner/instances/connectionmanager.cpp index 6504212d5a1..e6cbc29f4af 100644 --- a/src/plugins/qmldesigner/instances/connectionmanager.cpp +++ b/src/plugins/qmldesigner/instances/connectionmanager.cpp @@ -49,32 +49,21 @@ void ConnectionManager::setUp(NodeInstanceServerInterface *nodeInstanceServerPro processFinished(exitCode, exitStatus, connection.name); }); } - qDebug() << "Start QMLPuppets from: " << m_connections.at(0).qmlPuppetProcess.get()->program(); + if (!m_connections.empty() && m_connections.at(0).qmlPuppetProcess) + qDebug() << "Start QMLPuppets from: " << m_connections.at(0).qmlPuppetProcess.get()->program(); const int second = 1000; for (Connection &connection : m_connections) { - int waitConstant = 8 * second; - if (!connection.qmlPuppetProcess->waitForStarted(waitConstant)) { - closeSocketsAndKillProcesses(); - showCannotConnectToPuppetWarningAndSwitchToEditMode(); - return; - } - - waitConstant /= 2; - - bool connectedToPuppet = true; - if (!connection.localServer->hasPendingConnections()) - connectedToPuppet = connection.localServer->waitForNewConnection(waitConstant); - - if (connectedToPuppet) { - connection.socket.reset(connection.localServer->nextPendingConnection()); - QObject::connect(connection.socket.get(), &QIODevice::readyRead, this, [&] { - readDataStream(connection); - }); - } else { + int waitConstant = 5 * second; + + if (!connection.localServer->hasPendingConnections() && !connection.localServer->waitForNewConnection(waitConstant)) { closeSocketsAndKillProcesses(); showCannotConnectToPuppetWarningAndSwitchToEditMode(); return; } + connection.socket.reset(connection.localServer->nextPendingConnection()); + QObject::connect(connection.socket.get(), &QIODevice::readyRead, this, [&] { + readDataStream(connection); + }); connection.localServer->close(); } }