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

View File

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

View File

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

View File

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

View File

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

View File

@ -37,7 +37,10 @@
#pragma once #pragma once
#include <QPointer>
#include "ExternalResourcesPage.h" #include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
#include "ui_ExternalResourcesPage.h" #include "ui_ExternalResourcesPage.h"
#include "minecraft/mod/ResourcePackFolderModel.h" #include "minecraft/mod/ResourcePackFolderModel.h"
@ -62,10 +65,12 @@ class ResourcePackPage : public ExternalResourcesPage {
private slots: private slots:
void downloadResourcePacks(); void downloadResourcePacks();
void downloadDialogFinished(int result);
void updateResourcePacks(); void updateResourcePacks();
void deleteResourcePackMetadata(); void deleteResourcePackMetadata();
void changeResourcePackVersion(); void changeResourcePackVersion();
protected: protected:
std::shared_ptr<ResourcePackFolderModel> m_model; 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") if (m_instance->typeName() != "Minecraft")
return; // this is a null instance or a legacy instance return; // this is a null instance or a legacy instance
auto mdownload = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance); m_downloadDialog = new ResourceDownload::ShaderPackDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose); m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
if (mdownload->exec()) { 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()); auto tasks = new ConcurrentTask("Download Shader Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) { connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -102,8 +107,12 @@ void ShaderPackPage::downloadShaderPack()
tasks->deleteLater(); tasks->deleteLater();
}); });
for (auto& task : mdownload->getTasks()) { if (m_downloadDialog) {
tasks->addTask(task); for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
} }
ProgressDialog loadDialog(this); ProgressDialog loadDialog(this);

View File

@ -37,7 +37,9 @@
#pragma once #pragma once
#include <QPointer>
#include "ExternalResourcesPage.h" #include "ExternalResourcesPage.h"
#include "ui/dialogs/ResourceDownloadDialog.h"
class ShaderPackPage : public ExternalResourcesPage { class ShaderPackPage : public ExternalResourcesPage {
Q_OBJECT Q_OBJECT
@ -54,10 +56,12 @@ class ShaderPackPage : public ExternalResourcesPage {
public slots: public slots:
void downloadShaderPack(); void downloadShaderPack();
void downloadDialogFinished(int result);
void updateShaderPacks(); void updateShaderPacks();
void deleteShaderPackMetadata(); void deleteShaderPackMetadata();
void changeShaderPackVersion(); void changeShaderPackVersion();
private: private:
std::shared_ptr<ShaderPackFolderModel> m_model; 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") if (m_instance->typeName() != "Minecraft")
return; // this is a null instance or a legacy instance return; // this is a null instance or a legacy instance
auto mdownload = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance); auto m_downloadDialog = new ResourceDownload::TexturePackDownloadDialog(this, m_model, m_instance);
mdownload->setAttribute(Qt::WA_DeleteOnClose); m_downloadDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(this, &QObject::destroyed, mdownload, &QDialog::close); connect(this, &QObject::destroyed, m_downloadDialog, &QDialog::close);
if (mdownload->exec()) { }
void TexturePackPage::downloadDialogFinished(int result)
{
if (result) {
auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt()); auto tasks = new ConcurrentTask("Download Texture Packs", APPLICATION->settings()->get("NumberOfConcurrentDownloads").toInt());
connect(tasks, &Task::failed, [this, tasks](QString reason) { connect(tasks, &Task::failed, [this, tasks](QString reason) {
CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show();
@ -111,8 +115,12 @@ void TexturePackPage::downloadTexturePacks()
tasks->deleteLater(); tasks->deleteLater();
}); });
for (auto& task : mdownload->getTasks()) { if (m_downloadDialog) {
tasks->addTask(task); for (auto& task : m_downloadDialog->getTasks()) {
tasks->addTask(task);
}
} else {
qWarning() << "ResourceDownloadDialog vanished before we could collect tasks!";
} }
ProgressDialog loadDialog(this); ProgressDialog loadDialog(this);

View File

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