From 398db8f37197f74311a859cd1ebaafb3d113370c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 2 Mar 2017 16:04:36 +0100 Subject: Fix QbsProcess::cancel() Do proper state checking. In particular, only send a stop packet to the launcher if we are in the running state. This fixes a potential null pointer access when doing dry run builds. Change-Id: Ib3efdd09c4094190c746464718d642b353ae7566 Reviewed-by: Joerg Bornemann --- src/lib/corelib/tools/launchersocket.cpp | 2 ++ src/lib/corelib/tools/qbsprocess.cpp | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/corelib/tools/launchersocket.cpp b/src/lib/corelib/tools/launchersocket.cpp index 46b62413d..535be0778 100644 --- a/src/lib/corelib/tools/launchersocket.cpp +++ b/src/lib/corelib/tools/launchersocket.cpp @@ -58,6 +58,7 @@ LauncherSocket::LauncherSocket(QObject *parent) : QObject(parent) void LauncherSocket::sendData(const QByteArray &data) { + QBS_ASSERT(m_socket, return); QMutexLocker locker(&m_requestsMutex); m_requests << data; if (m_requests.count() == 1) @@ -66,6 +67,7 @@ void LauncherSocket::sendData(const QByteArray &data) void LauncherSocket::shutdown() { + QBS_ASSERT(m_socket, return); m_socket->disconnect(); m_socket->write(ShutdownPacket().serialize()); m_socket->waitForBytesWritten(1000); diff --git a/src/lib/corelib/tools/qbsprocess.cpp b/src/lib/corelib/tools/qbsprocess.cpp index 8495d72a0..52ce3f25a 100644 --- a/src/lib/corelib/tools/qbsprocess.cpp +++ b/src/lib/corelib/tools/qbsprocess.cpp @@ -88,7 +88,19 @@ void QbsProcess::doStart() void QbsProcess::cancel() { - sendPacket(StopProcessPacket(token())); + switch (m_state) { + case QProcess::NotRunning: + break; + case QProcess::Starting: + m_errorString = Tr::tr("Process canceled before it was started."); + m_error = QProcess::FailedToStart; + m_state = QProcess::NotRunning; + emit error(m_error); + break; + case QProcess::Running: + sendPacket(StopProcessPacket(token())); + break; + } } QByteArray QbsProcess::readAllStandardOutput() -- cgit v1.2.1