From f44387385318d47648d720060caf5534b7d7c6de Mon Sep 17 00:00:00 2001 From: yeshanshan Date: Tue, 14 Jul 2026 11:35:11 +0800 Subject: [PATCH] fix: improve process name resolution for DBus clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Change process name detection to prefer /proc/{pid}/exe symlink for accuracy 2. Add fallback to /proc/{pid}/cmdline on permission errors (daemon runs as deepin-daemon) 3. Ensure command line content is non-empty before returning 4. In getAppid(): avoid caching stale app names across different DBus services 5. Move m_appName assignment outside the isEmpty guard to refresh per connection 6. Always return testappid only when not called from DBus Log: Improved process identification for DConfig clients Influence: 1. Test DConfig access from multiple DBus services with different PIDs 2. Verify process name is correctly resolved for processes with permission constraints 3. Verify cached app name is refreshed when the same connection handles different DBus services 4. Confirm fallback to PID number when both exe and cmdline fail 5. Test non-DBus calls (e.g., unit tests) return "testappid" correctly fix: 改进DBus客户端的进程名称解析 1. 将进程名称检测改为优先使用 /proc/{pid}/exe 符号链接以提高准确性 2. 在权限错误时回退到 /proc/{pid}/cmdline(守护进程以deepin-daemon身份 运行) 3. 确保命令行内容非空后才返回 4. 在getAppid()中:避免在不同DBus服务间缓存过时的应用名称 5. 将m_appName赋值移出isEmpty检查,确保每个连接刷新 6. 仅在非DBus调用时返回"testappid" Log: 改进DConfig客户端的进程识别功能 Influence: 1. 测试从多个不同DBus服务访问DConfig,验证PID正确 2. 验证受限权限下进程名称能正确解析 3. 验证同一连接处理不同DBus服务时,缓存的app名称刷新 4. 确认当exe和cmdline都失败时回退到PID 5. 测试非DBus调用(如单元测试)正确返回"testappid" --- .../dde-dconfig-daemon/dconfig_global.h | 20 ++++++++++++++----- .../dde-dconfig-daemon/dconfigconn.cpp | 12 +++++------ .../dde-dconfig-daemon/dconfigconn.h | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/dconfig-center/dde-dconfig-daemon/dconfig_global.h b/dconfig-center/dde-dconfig-daemon/dconfig_global.h index 5fabc36..f2423a3 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfig_global.h +++ b/dconfig-center/dde-dconfig-daemon/dconfig_global.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -178,12 +179,21 @@ class ObjectPool inline QString getProcessNameByPid(const uint pid) { #ifdef Q_OS_LINUX - const QString desc = QString("/proc/%1/cmdline").arg(pid); - - QFile file(desc); - if(file.open(QIODevice::ReadOnly)) { + // Prefer /proc/{pid}/exe symlink for process name. + // May fail due to permission (daemon runs as deepin-daemon, target process + // may belong to another user). Fallback to /proc/{pid}/cmdline in that case. + const QString exePath = QFile::symLinkTarget(QString("/proc/%1/exe").arg(pid)); + if (!exePath.isEmpty()) + return exePath; + + // Fallback: /proc/{pid}/cmdline is world-readable (0444) + const QString cmdlinePath = QString("/proc/%1/cmdline").arg(pid); + QFile file(cmdlinePath); + if (file.open(QIODevice::ReadOnly)) { const QByteArray &name = file.readLine(); - return name.split('\0').join(" ").trimmed(); + const QString cmd = name.split('\0').join(" ").trimmed(); + if (!cmd.isEmpty()) + return cmd; } #endif // Q_OS_LINUX return QString::number(pid); diff --git a/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp b/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp index aca083c..bacf7df 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp +++ b/dconfig-center/dde-dconfig-daemon/dconfigconn.cpp @@ -240,15 +240,15 @@ int DSGConfigConn::flags(const QString &key) QString DSGConfigConn::getAppid() const { - if (m_appName.isEmpty()) { - if (calledFromDBus()) { - const QString &service = message().service(); + if (calledFromDBus()) { + const QString &service = message().service(); + if (m_lastService != service) { + const_cast(this)->m_lastService = service; const_cast(this)->m_appName = getProcessNameByPid(connection().interface()->servicePid(service)); - } else { - const_cast(this)->m_appName = QString("testappid"); } + return m_appName; } - return m_appName; + return QString("testappid"); } bool DSGConfigConn::contains(const QString &key) diff --git a/dconfig-center/dde-dconfig-daemon/dconfigconn.h b/dconfig-center/dde-dconfig-daemon/dconfigconn.h index aa56248..67d12a6 100644 --- a/dconfig-center/dde-dconfig-daemon/dconfigconn.h +++ b/dconfig-center/dde-dconfig-daemon/dconfigconn.h @@ -72,5 +72,5 @@ public Q_SLOTS: // METHODS ConnKey m_key; DSGConfigResource *m_resource = nullptr; QString m_appName; + QString m_lastService; }; -