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