aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2026-04-24 17:45:57 +0200
committersaturneric <[email protected]>2026-04-24 17:45:57 +0200
commita8313986d89789b766ec21faf6fad86a9fab436f (patch)
tree540324e2095bb482d0a95d679eb6066d2c9b85d4
parentchore(build): gate optional modules in sandbox (diff)
downloadmodules-a8313986d89789b766ec21faf6fad86a9fab436f.tar.gz
modules-a8313986d89789b766ec21faf6fad86a9fab436f.zip
fix(version-checking): avoid thread race on UI
* Connect version-check signals to the UI object/app instance to ensure callbacks run on the main thread * Apply network settings via a guarded pointer to prevent use-after-free when the settings tab is deleted during invocation * Bump module version to 1.4.2
-rw-r--r--src/m_ver_check/UpdateTab.cpp12
-rw-r--r--src/m_ver_check/VersionCheckingModule.cpp18
2 files changed, 20 insertions, 10 deletions
diff --git a/src/m_ver_check/UpdateTab.cpp b/src/m_ver_check/UpdateTab.cpp
index 9295f6d..d21df20 100644
--- a/src/m_ver_check/UpdateTab.cpp
+++ b/src/m_ver_check/UpdateTab.cpp
@@ -219,17 +219,17 @@ void UpdateTab::slot_check_version_update() {
if (api == "bktus") {
auto* task = new BKTUSVersionCheckTask();
- connect(task, &BKTUSVersionCheckTask::SignalUpgradeVersion,
- QThread::currentThread(),
- [this](const SoftwareVersion&) { slot_show_version_status(); });
+ connect(
+ task, &BKTUSVersionCheckTask::SignalUpgradeVersion, this,
+ [this](const SoftwareVersion&) -> void { slot_show_version_status(); });
connect(task, &BKTUSVersionCheckTask::SignalUpgradeVersion, task,
&QObject::deleteLater);
task->Run();
} else {
auto* task = new GitHubVersionCheckTask();
- connect(task, &GitHubVersionCheckTask::SignalUpgradeVersion,
- QThread::currentThread(),
- [this](const SoftwareVersion&) { slot_show_version_status(); });
+ connect(
+ task, &GitHubVersionCheckTask::SignalUpgradeVersion, this,
+ [this](const SoftwareVersion&) -> void { slot_show_version_status(); });
connect(task, &GitHubVersionCheckTask::SignalUpgradeVersion, task,
&QObject::deleteLater);
task->Run();
diff --git a/src/m_ver_check/VersionCheckingModule.cpp b/src/m_ver_check/VersionCheckingModule.cpp
index dc580d3..edec907 100644
--- a/src/m_ver_check/VersionCheckingModule.cpp
+++ b/src/m_ver_check/VersionCheckingModule.cpp
@@ -46,7 +46,7 @@
#include "Utils.h"
GF_MODULE_API_DEFINE_V2("com.bktus.gpgfrontend.module.version_checking",
- "VersionChecking", "1.4.1",
+ "VersionChecking", "1.4.2",
"Try checking GpgFrontend version.", "Saturneric");
DEFINE_TRANSLATIONS_STRUCTURE(ModuleVersionChecking);
@@ -91,7 +91,7 @@ auto CheckUpdate(const QMap<QString, QString>& event) -> int {
auto* task = new GitHubVersionCheckTask();
QObject::connect(
task, &GitHubVersionCheckTask::SignalUpgradeVersion,
- QThread::currentThread(), [event](const SoftwareVersion& sv) {
+ QCoreApplication::instance(), [event](const SoftwareVersion& sv) {
GFDurableCacheSave(DUP("update_checking_cache"),
DUP(QJsonDocument(sv.ToJson()).toJson()));
CB_SUCC(event);
@@ -162,7 +162,7 @@ REGISTER_EVENT_HANDLER(MAINWINDOW_MENU_MOUNTED, [](const MEvent& event) -> int {
"GTrC", "Check for updates from the Internet."));
action->setIcon(QIcon(":/icons/update.png"));
QObject::connect(action, &QAction::triggered, parent,
- [=]() { RaiseUpdateDialog(parent); });
+ [=]() -> void { RaiseUpdateDialog(parent); });
help_menu->addAction(action);
},
Qt::BlockingQueuedConnection);
@@ -336,11 +336,21 @@ REGISTER_EVENT_HANDLER(
CB_ERR(event, -1, "network_settings_tab handle invalid or not QWidget");
}
+ // we need to apply the settings in the main thread to avoid some
+ // potential racing conditions
+ auto p_tab = QPointer<QWidget>(tab);
+
QMetaObject::invokeMethod(
QApplication::instance(),
[=]() {
+ if (!p_tab) {
+ LOG_ERROR(
+ "network settings tab apply settings: network_settings_tab "
+ "already deleted when applying settings");
+ return;
+ }
auto* update_checking_check_box =
- tab->findChild<QCheckBox*>("update_checking_check_box");
+ p_tab->findChild<QCheckBox*>("update_checking_check_box");
if (update_checking_check_box) {
settings->setValue(
"network/version_checking/"