Merge pull request #2916 from Ryex/fix/progress_dialog_use_after_free

fix: ensure all connections to the ProgressDialogs's Task the dialog made are disconnected
This commit is contained in:
Alexandru Ionut Tripon 2024-10-15 08:59:12 +03:00 committed by GitHub
commit 43eb27b695
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 9 deletions

View File

@ -90,6 +90,9 @@ void ProgressDialog::on_skipButton_clicked(bool checked)
ProgressDialog::~ProgressDialog()
{
for (auto conn : this->m_taskConnections) {
disconnect(conn);
}
delete ui;
}
@ -140,15 +143,15 @@ int ProgressDialog::execWithTask(Task* task)
}
// Connect signals.
connect(task, &Task::started, this, &ProgressDialog::onTaskStarted);
connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed);
connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded);
connect(task, &Task::status, this, &ProgressDialog::changeStatus);
connect(task, &Task::details, this, &ProgressDialog::changeStatus);
connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress);
connect(task, &Task::progress, this, &ProgressDialog::changeProgress);
connect(task, &Task::aborted, this, &ProgressDialog::hide);
connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled);
this->m_taskConnections.push_back(connect(task, &Task::started, this, &ProgressDialog::onTaskStarted));
this->m_taskConnections.push_back(connect(task, &Task::failed, this, &ProgressDialog::onTaskFailed));
this->m_taskConnections.push_back(connect(task, &Task::succeeded, this, &ProgressDialog::onTaskSucceeded));
this->m_taskConnections.push_back(connect(task, &Task::status, this, &ProgressDialog::changeStatus));
this->m_taskConnections.push_back(connect(task, &Task::details, this, &ProgressDialog::changeStatus));
this->m_taskConnections.push_back(connect(task, &Task::stepProgress, this, &ProgressDialog::changeStepProgress));
this->m_taskConnections.push_back(connect(task, &Task::progress, this, &ProgressDialog::changeProgress));
this->m_taskConnections.push_back(connect(task, &Task::aborted, this, &ProgressDialog::hide));
this->m_taskConnections.push_back(connect(task, &Task::abortStatusChanged, ui->skipButton, &QPushButton::setEnabled));
m_is_multi_step = task->isMultiStep();
ui->taskProgressScrollArea->setHidden(!m_is_multi_step);

View File

@ -93,6 +93,8 @@ class ProgressDialog : public QDialog {
Ui::ProgressDialog* ui;
Task* m_task;
QList<QMetaObject::Connection> m_taskConnections;
bool m_is_multi_step = false;
QHash<QUuid, SubTaskProgressBar*> taskProgress;