Qt: Fix use-after-free race condition in achievement login dialog

This commit is contained in:
chaoticgd authored and lightningterror committed 2025-09-25 03:16:49 +02:00
1 parent a46ee17537
commit c79e6ecc2c
1 file changed
+10 -2
+10 -2
View File
@@ -9,6 +9,7 @@
#include "common/Error.h"
#include <QtCore/QPointer>
#include <QtWidgets/QMessageBox>
AchievementLoginDialog::AchievementLoginDialog(QWidget* parent, Achievements::LoginRequestReason reason)
@@ -44,11 +45,18 @@ void AchievementLoginDialog::loginClicked()
m_ui.status->setText(tr("Logging in..."));
enableUI(false);
Host::RunOnCPUThread([this, username = std::move(username), password = std::move(password)]() {
const QPointer<AchievementLoginDialog> dialog(this);
Host::RunOnCPUThread([dialog, username = std::move(username), password = std::move(password)]() {
Error error;
const bool result = Achievements::Login(username.c_str(), password.c_str(), &error);
const QString message = QString::fromStdString(error.GetDescription());
QMetaObject::invokeMethod(this, "processLoginResult", Qt::QueuedConnection, Q_ARG(bool, result), Q_ARG(const QString&, message));
QtHost::RunOnUIThread([dialog, result, message = std::move(message)]() {
if (!dialog)
return;
dialog->processLoginResult(result, message);
});
});
}