[Backport release-10.x] Fix InstanceStaging reentry crash during Modrinth pack updates (#5048)

This commit is contained in:
Alexandru Ionut Tripon 2026-02-17 21:39:59 +02:00 committed by GitHub
commit 074c54749b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 0 deletions

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();
}

View file

@ -32,6 +32,7 @@ void EntitlementsStep::perform()
{ "Authorization", QString("Bearer %1").arg(m_data->yggdrasilToken.token).toUtf8() } };
m_response.reset(new QByteArray());
m_request = Net::Download::makeByteArray(url, m_response.get());
m_request->addHeaderProxy(std::make_unique<Net::RawHeaderProxy>(headers));
m_request->enableAutoRetry(true);