From 72a68fac43e1adb0745b48b96f5635d5aa33ccbb Mon Sep 17 00:00:00 2001 From: wangshaojun Date: Wed, 4 Feb 2026 17:50:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20DSysInfo=20?= =?UTF-8?q?=E5=9C=A8=20AArch64=20=E6=9E=B6=E6=9E=84=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 AArch64 弱内存模型下,DSysInfoPrivate 的多个 ensure* 函数由于缺乏 互斥锁保护,在多线程并发访问时(如应用商店后台服务)会导致以下问题: 1. 引用计数损坏:由于读取到初始化一半的 QString 指针,导致非对齐访问触发 SIGBUS。 2. 堆内存损坏:多个线程同时解析文件并操作 QMap/QByteArray 导致 double free。 3. 状态可见性问题:一个核心修改了初始化标志位,但其他核心看到的成员变量尚未完成写入。 本修改通过在 DSysInfoPrivate 中引入 QMutex,确保了单例初始化过程的原子性 和内存可见性。 Log: 修复 AArch64 架构下 DSysInfo 随机触发 SIGBUS/SIGSEGV 崩溃的问题。 Bug: https://pms.uniontech.com/bug-view-350151.html Change-Id: Ib23b078c3eef5c3ad8aef5a36035ac4839d11bb2 --- src/dsysinfo.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index ef965553..c26fc82e 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include #ifdef Q_OS_LINUX #include @@ -49,6 +51,8 @@ class Q_DECL_HIDDEN DSysInfoPrivate public: DSysInfoPrivate(); + mutable QMutex mutex; + #ifdef Q_OS_LINUX void ensureDeepinInfo(); bool ensureOsVersion(); @@ -167,6 +171,7 @@ bool DSysInfoPrivate::splitA_BC_DMode() void DSysInfoPrivate::ensureDeepinInfo() { + QMutexLocker locker(&mutex); if (static_cast(deepinType) > 0 && !inTest()) return; @@ -246,8 +251,11 @@ void DSysInfoPrivate::ensureDeepinInfo() bool DSysInfoPrivate::ensureOsVersion() { + QMutexLocker locker(&mutex); +#ifndef OS_VERSION_TEST_FILE // Always re-read the file when testing if (osBuild.A > 0 && !inTest()) return true; +#endif DDesktopEntry entry(OS_VERSION_FILE); bool ok = false; @@ -447,6 +455,7 @@ static bool readLsbRelease(DSysInfoPrivate *info) void DSysInfoPrivate::ensureReleaseInfo() { + QMutexLocker locker(&mutex); if (productType > 0 && !inTest()) { return; }