forked from qt-creator/qt-creator
Plugin install: Fix crash on cancel
When the process is aborted, both errorOccurred and then finished is sent. Because of the combination of deleteLater and QueuedConnection this leads to m_process being already nullptr when finished is sent, so add some guards. Change-Id: I446114176f8fa5934b411b39d77c97d6267303fa Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -207,6 +207,8 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest)
|
|||||||
&QProcess::readyReadStandardOutput,
|
&QProcess::readyReadStandardOutput,
|
||||||
archive,
|
archive,
|
||||||
[archive]() {
|
[archive]() {
|
||||||
|
if (!archive->m_process)
|
||||||
|
return;
|
||||||
archive->outputReceived(QString::fromUtf8(archive->m_process->readAllStandardOutput()));
|
archive->outputReceived(QString::fromUtf8(archive->m_process->readAllStandardOutput()));
|
||||||
},
|
},
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
@@ -215,6 +217,8 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest)
|
|||||||
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
archive,
|
archive,
|
||||||
[archive](int, QProcess::ExitStatus) {
|
[archive](int, QProcess::ExitStatus) {
|
||||||
|
if (!archive->m_process)
|
||||||
|
return;
|
||||||
archive->finished(archive->m_process->exitStatus() == QProcess::NormalExit
|
archive->finished(archive->m_process->exitStatus() == QProcess::NormalExit
|
||||||
&& archive->m_process->exitCode() == 0);
|
&& archive->m_process->exitCode() == 0);
|
||||||
archive->m_process->deleteLater();
|
archive->m_process->deleteLater();
|
||||||
@@ -227,6 +231,8 @@ Archive *Archive::unarchive(const FilePath &src, const FilePath &dest)
|
|||||||
&QProcess::errorOccurred,
|
&QProcess::errorOccurred,
|
||||||
archive,
|
archive,
|
||||||
[archive](QProcess::ProcessError) {
|
[archive](QProcess::ProcessError) {
|
||||||
|
if (!archive->m_process)
|
||||||
|
return;
|
||||||
archive->outputReceived(tr("Command failed."));
|
archive->outputReceived(tr("Command failed."));
|
||||||
archive->finished(false);
|
archive->finished(false);
|
||||||
archive->m_process->deleteLater();
|
archive->m_process->deleteLater();
|
||||||
|
Reference in New Issue
Block a user