diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-01-16 12:26:27 +0100 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2017-01-16 12:28:19 +0000 |
commit | 4a26a2c28364d09b5b45e7f23903671fb39a8e40 (patch) | |
tree | b0fe365875daacf10c3d05584b225303a29280c7 /src/plugins/projectexplorer/abstractprocessstep.cpp | |
parent | 6e13b7afbbe852c8a9200870c4f4aa34f91bb4b2 (diff) |
AbstractProcessStep: Do not crash when cancelling a build
Task-number: QTCREATORBUG-17591
Change-Id: I3d03b46ba1abbf11ba681d690647b3114fbb28a5
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer/abstractprocessstep.cpp')
-rw-r--r-- | src/plugins/projectexplorer/abstractprocessstep.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 4e64bb09eb..adf23706ff 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -212,11 +212,12 @@ void AbstractProcessStep::run(QFutureInterface<bool> &fi) m_timer.start(); } -void AbstractProcessStep::cleanUp() +void AbstractProcessStep::cleanUp(QProcess *process) { // The process has finished, leftover data is read in processFinished - processFinished(m_process->exitCode(), m_process->exitStatus()); - const bool returnValue = processSucceeded(m_process->exitCode(), m_process->exitStatus()) || m_ignoreReturnValue; + bool returnValue = false; + processFinished(process->exitCode(), process->exitStatus()); + returnValue = processSucceeded(process->exitCode(), process->exitStatus()) || m_ignoreReturnValue; m_outputParserChain.reset(); m_process.reset(); @@ -293,6 +294,8 @@ bool AbstractProcessStep::processSucceeded(int exitCode, QProcess::ExitStatus st void AbstractProcessStep::processReadyReadStdOutput() { + if (!m_process) + return; m_process->setReadChannel(QProcess::StandardOutput); while (m_process->canReadLine()) { QString line = QString::fromLocal8Bit(m_process->readLine()); @@ -315,6 +318,8 @@ void AbstractProcessStep::stdOutput(const QString &line) void AbstractProcessStep::processReadyReadStdError() { + if (!m_process) + return; m_process->setReadChannel(QProcess::StandardError); while (m_process->canReadLine()) { QString line = QString::fromLocal8Bit(m_process->readLine()); @@ -344,6 +349,7 @@ void AbstractProcessStep::checkForCancel() { if (m_futureInterface->isCanceled() && m_timer.isActive()) { m_timer.stop(); + Core::Reaper::reap(m_process.release()); } } @@ -412,13 +418,17 @@ void AbstractProcessStep::slotProcessFinished(int, QProcess::ExitStatus) { m_timer.stop(); - const QString stdErrLine = QString::fromLocal8Bit(m_process->readAllStandardError()); - if (!stdErrLine.isEmpty()) - stdError(stdErrLine); + QProcess *process = m_process.get(); + if (!process) // Happens when the process was canceled and handed over to the Reaper. + process = qobject_cast<QProcess *>(sender()); // The process was canceled! + + const QString stdErrLine = process ? QString::fromLocal8Bit(process->readAllStandardError()) : QString(); + for (const QString &l : stdErrLine.split('\n')) + stdError(l); - const QString stdoutLine = QString::fromLocal8Bit(m_process->readAllStandardOutput()); - if (!stdoutLine.isEmpty()) - stdOutput(stdoutLine); + const QString stdOutLine = process ? QString::fromLocal8Bit(process->readAllStandardOutput()) : QString(); + for (const QString &l : stdOutLine.split('\n')) + stdError(l); - cleanUp(); + cleanUp(process); } |