diff options
| author | saturneric <[email protected]> | 2026-04-24 17:45:57 +0200 |
|---|---|---|
| committer | saturneric <[email protected]> | 2026-04-24 17:45:57 +0200 |
| commit | a8313986d89789b766ec21faf6fad86a9fab436f (patch) | |
| tree | 540324e2095bb482d0a95d679eb6066d2c9b85d4 | |
| parent | chore(build): gate optional modules in sandbox (diff) | |
| download | modules-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.cpp | 12 | ||||
| -rw-r--r-- | src/m_ver_check/VersionCheckingModule.cpp | 18 |
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/" |
