From c79e6ecc2c72b58e28e4eccd53f82fe62650a594 Mon Sep 17 00:00:00 2001 From: chaoticgd <43898262+chaoticgd@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:51:17 +0100 Subject: [PATCH] Qt: Fix use-after-free race condition in achievement login dialog --- pcsx2-qt/Settings/AchievementLoginDialog.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pcsx2-qt/Settings/AchievementLoginDialog.cpp b/pcsx2-qt/Settings/AchievementLoginDialog.cpp index db4ba84a3d..7794ff9916 100644 --- a/pcsx2-qt/Settings/AchievementLoginDialog.cpp +++ b/pcsx2-qt/Settings/AchievementLoginDialog.cpp @@ -9,6 +9,7 @@ #include "common/Error.h" +#include #include 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 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); + }); }); }