fix: use after free begone!

Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com>
This commit is contained in:
Rachel Powers 2025-04-19 06:16:57 -07:00
parent da30904630
commit d0ccd110a1
No known key found for this signature in database
GPG Key ID: E10E321EB160949B
10 changed files with 86 additions and 26 deletions

View File

@ -96,6 +96,7 @@
#include <QList>
#include <QNetworkAccessManager>
#include <QStringList>
#include <QStringLiteral>
#include <QStyleFactory>
#include <QTranslator>
#include <QWindow>
@ -125,7 +126,6 @@
#include <FileSystem.h>
#include <LocalPeer.h>
#include <QStringLiteral>
#include <stdlib.h>
#include <sys.h>
#include "SysInfo.h"

View File

@ -3,6 +3,9 @@
# prevent log spam and strange bugs
# qt.qpa.drawing in particular causes theme artifacts on MacOS
qt.*.debug=false
# supress image format noise
kf.imageformats.plugins.hdr=false
kf.imageformats.plugins.xcf=false
# don't log credentials by default
launcher.auth.credentials.debug=false
# remove the debug lines, other log levels still get through

View File

@ -48,6 +48,7 @@
#include <QMessageBox>
#include <QSortFilterProxyModel>
#include <algorithm>
#include <memory>
#include "Application.h"
@ -145,10 +146,17 @@ void ModFolderPage::downloadMods()
QMessageBox::critical(this, tr("Error"), tr("Please install a mod loader first!"));
return;
}
auto mdownload = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close);
if (mdownload->exec()) {
m_downloadDialog = new ResourceDownload::ModDownloadDialog(this, m_model, m_instance);
m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
connect(m_downloadDialog, &QDialog::finished, this, &ModFolderPage::downloadDialogFinished);
m_downloadDialog->open();
}
void ModFolderPage::downloadDialogFinished(int result)
{
if (result) {
auto tasks = new ConcurrentTask(tr("Download Mods"), APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -166,9 +174,13 @@ void ModFolderPage::downloadMods()
tasks->deleteLater();
});
for (auto& task : mdownload->getTasks()) {
if (m_downloadDialog) {
for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
}
ProgressDialog loadDialog(this);
loadDialog.setSkipButton(true, tr("Abort"));

View File

@ -38,7 +38,9 @@
#pragma once
#include <QPointer>
#include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
class ModFolderPage : public ExternalResourcesPage {
Q_OBJECT
@ -63,6 +65,7 @@ class ModFolderPage : public ExternalResourcesPage {
void removeItems(const QItemSelection& selection) override;
void downloadMods();
void downloadDialogFinished(int result);
void updateMods(bool includeDeps = false);
void deleteModMetadata();
void exportModMetadata();
@ -70,6 +73,7 @@ class ModFolderPage : public ExternalResourcesPage {
protected:
std::shared_ptr<ModFolderModel> m_model;
QPointer<ResourceDownload::ModDownloadDialog> m_downloadDialog;
};
class CoreModFolderPage : public ModFolderPage {

View File

@ -84,10 +84,16 @@ void ResourcePackPage::downloadResourcePacks()
if (m_instance->typeName() != "Minecraft")
return; // this is a null instance or a legacy instance
auto mdownload = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close);
if (mdownload->exec()) {
m_downloadDialog = new ResourceDownload::ResourcePackDownloadDialog(this, m_model, m_instance);
m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
connect(m_downloadDialog, &QDialog::finished, this, &ResourcePackPage::downloadDialogFinished);
m_downloadDialog->open();
}
void ResourcePackPage::downloadDialogFinished(int result)
{
if (result) {
auto tasks = new ConcurrentTask("Download Resource Pack", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -105,9 +111,13 @@ void ResourcePackPage::downloadResourcePacks()
tasks->deleteLater();
});
for (auto& task : mdownload->getTasks()) {
if (m_downloadDialog) {
for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
}
ProgressDialog loadDialog(this);
loadDialog.setSkipButton(true, tr("Abort"));

View File

@ -37,7 +37,10 @@
#pragma once
#include <QPointer>
#include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
#include "ui_ExternalResourcesPage.h"
#include "minecraft/mod/ResourcePackFolderModel.h"
@ -62,10 +65,12 @@ class ResourcePackPage : public ExternalResourcesPage {
private slots:
void downloadResourcePacks();
void downloadDialogFinished(int result);
void updateResourcePacks();
void deleteResourcePackMetadata();
void changeResourcePackVersion();
protected:
std::shared_ptr<ResourcePackFolderModel> m_model;
QPointer<ResourceDownload::ResourceDownloadDialog> m_downloadDialog;
};

View File

@ -81,10 +81,15 @@ void ShaderPackPage::downloadShaderPack()
if (m_instance->typeName() != "Minecraft")
return; // this is a null instance or a legacy instance
auto mdownload = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close);
if (mdownload->exec()) {
m_downloadDialog = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance);
m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
connect(m_downloadDialog, &QDialog::finished, this, &ShaderPackPage::downloadDialogFinished);
m_downloadDialog->open();
}
void ShaderPackPage::downloadDialogFinished(int result) {
if (result) {
auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -102,9 +107,13 @@ void ShaderPackPage::downloadShaderPack()
tasks->deleteLater();
});
for (auto& task : mdownload->getTasks()) {
if (m_downloadDialog) {
for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
}
ProgressDialog loadDialog(this);
loadDialog.setSkipButton(true, tr("Abort"));

View File

@ -37,7 +37,9 @@
#pragma once
#include <QPointer>
#include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
class ShaderPackPage : public ExternalResourcesPage {
Q_OBJECT
@ -54,10 +56,12 @@ class ShaderPackPage : public ExternalResourcesPage {
public slots:
void downloadShaderPack();
void downloadDialogFinished(int result);
void updateShaderPacks();
void deleteShaderPackMetadata();
void changeShaderPackVersion();
private:
std::shared_ptr<ShaderPackFolderModel> m_model;
QPointer<ResourceDownload::ShaderPackDownloadDialog> m_downloadDialog;
};

View File

@ -90,10 +90,14 @@ void TexturePackPage::downloadTexturePacks()
if (m_instance->typeName() != "Minecraft")
return; // this is a null instance or a legacy instance
auto mdownload = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close);
if (mdownload->exec()) {
auto m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance);
m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
}
void TexturePackPage::downloadDialogFinished(int result)
{
if (result) {
auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -111,9 +115,13 @@ void TexturePackPage::downloadTexturePacks()
tasks->deleteLater();
});
for (auto& task : mdownload->getTasks()) {
if (m_downloadDialog) {
for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
}
ProgressDialog loadDialog(this);
loadDialog.setSkipButton(true, tr("Abort"));

View File

@ -37,7 +37,10 @@
#pragma once
#include <QPointer>
#include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
#include "ui_ExternalResourcesPage.h"
#include "minecraft/mod/TexturePackFolderModel.h"
@ -57,10 +60,12 @@ class TexturePackPage : public ExternalResourcesPage {
public slots:
void updateFrame(const QModelIndex& current, const QModelIndex& previous) override;
void downloadTexturePacks();
void downloadDialogFinished(int result);
void updateTexturePacks();
void deleteTexturePackMetadata();
void changeTexturePackVersion();
private:
std::shared_ptr<TexturePackFolderModel> m_model;
QPointer<ResourceDownload::TexturePackDownloadDialog> m_downloadDialog;
};