Repository navigation
fix: vt user lookup to prefer real user sessions over greeter entries - #93
Conversation
pms: BUG-349759 log: vt user lookup to prefer real user sessions over greeter entries
deepin pr auto review你好!我是CodeGeeX。我已仔细审查了你提供的 整体来看,代码的容错性有所提升,但存在一个严重的逻辑缺陷,以及在代码质量和性能上的可优化空间。以下是详细的审查意见: 1. 语法与逻辑 (严重缺陷)问题: 推测真实意图与修复方案: 2. 代码性能问题:循环内频繁构造和比较 3. 代码质量问题:魔法字符串 问题:日志输出位置 4. 代码安全问题:空指针解引用风险已修复 💡 改进后的代码建议基于以上分析,我为你重构了这部分代码,修复了核心逻辑缺陷,并提升了代码可读性: const QString DisplayManager::findUserByVt(int vtnr) {
// 建议将 "dde" 提取为类成员或静态常量,避免魔法字符串
static const QString GREETER_USER = QStringLiteral("dde");
QString matchedGreeterUser;
for (const auto& session : m_sessions) {
// 防止空指针
if (!session) {
continue;
}
if (vtnr == session->VTNr()) {
// 优先选择非 Greeter 用户
if (session->User() != GREETER_USER) {
qDebug() << "[DisplayManager] findUserByVt selected user session vtnr="
<< vtnr << " user=" << session->User();
return session->User();
}
// 如果是 Greeter 用户,先记录下来,不立即返回,继续寻找是否有普通用户
else {
matchedGreeterUser = session->User();
}
}
}
// 循环结束后,如果没有找到普通用户,但找到了 Greeter 用户,则返回 Greeter
if (!matchedGreeterUser.isEmpty()) {
qDebug() << "[DisplayManager] findUserByVt selected greeter session vtnr="
<< vtnr << " user=" << matchedGreeterUser;
return matchedGreeterUser;
}
qWarning() << "[DisplayManager] findUserByVt found no session for vtnr=" << vtnr;
return QString();
}主要改动说明:
|
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: justforlxz, zorowk The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
pms: BUG-349759
log: vt user lookup to prefer real user sessions over greeter entries
findUserByVt() 的作用,是把当前活动 VT 反查成“这个 VT 上应该对应谁”。
原来的问题是,同一个 VT 上可能同时存在两类会话记录:
dde 的 greeter 占位会话
用户真实登录后的会话,比如 uos
如果代码只是按 VTNr 先找到第一条记录就返回,就可能先返回 dde。这样在 VT 切换回图形界面时,后端会误以为当前应该激活 greeter,而不是用户会话,最后就会把 switchToUser("dde") 发出去,导致 greeter
状态和真实用户状态错位。
这个提交的原理就是两步:
同一个 VT 上,先找真实用户会话,跳过 dde
如果没有真实用户会话,再退回到 dde
同一个 VT 上残留了多个 session 记录,而代码错误地把 greeter session 当成了当前用户 session。