Fix InstanceStaging reentry crash during Modrinth pack updates (#4982)

This commit is contained in:
Alexandru Ionut Tripon 2026-02-17 18:28:27 +00:00 committed by GitHub
commit ba325a6012
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -928,6 +928,7 @@ class InstanceStaging : public Task {
connect(child, &Task::progress, this, &InstanceStaging::setProgress); connect(child, &Task::progress, this, &InstanceStaging::setProgress);
connect(child, &Task::stepProgress, this, &InstanceStaging::propagateStepProgress); connect(child, &Task::stepProgress, this, &InstanceStaging::propagateStepProgress);
connect(&m_backoffTimer, &QTimer::timeout, this, &InstanceStaging::childSucceeded); connect(&m_backoffTimer, &QTimer::timeout, this, &InstanceStaging::childSucceeded);
m_backoffTimer.setSingleShot(true);
} }
virtual ~InstanceStaging() {} virtual ~InstanceStaging() {}
@ -959,13 +960,17 @@ class InstanceStaging : public Task {
private slots: private slots:
void childSucceeded() void childSucceeded()
{ {
if (!isRunning())
return;
unsigned sleepTime = backoff(); unsigned sleepTime = backoff();
if (m_parent->commitStagedInstance(m_stagingPath, *m_child.get(), m_child->group(), *m_child.get())) { if (m_parent->commitStagedInstance(m_stagingPath, *m_child.get(), m_child->group(), *m_child.get())) {
m_backoffTimer.stop();
emitSucceeded(); emitSucceeded();
return; return;
} }
// we actually failed, retry? // we actually failed, retry?
if (sleepTime == maxBackoff) { if (sleepTime == maxBackoff) {
m_backoffTimer.stop();
emitFailed(tr("Failed to commit instance, even after multiple retries. It is being blocked by something.")); emitFailed(tr("Failed to commit instance, even after multiple retries. It is being blocked by something."));
return; return;
} }
@ -974,12 +979,14 @@ class InstanceStaging : public Task {
} }
void childFailed(const QString& reason) void childFailed(const QString& reason)
{ {
m_backoffTimer.stop();
m_parent->destroyStagingPath(m_stagingPath); m_parent->destroyStagingPath(m_stagingPath);
emitFailed(reason); emitFailed(reason);
} }
void childAborted() void childAborted()
{ {
m_backoffTimer.stop();
m_parent->destroyStagingPath(m_stagingPath); m_parent->destroyStagingPath(m_stagingPath);
emitAborted(); emitAborted();
} }