logind: Don't match non-leader processes for utmp TTY determination

This ensures we don't erroneously assign pseudoterminals created by
terminal emulators that use utempter to register themselves in utmp when
run under a GUI session that doesn't have a TTY assigned.
This commit is contained in:
Myrrh Periwinkle
2025-07-02 12:53:15 +07:00
parent 821b453170
commit 1a088b564a
3 changed files with 24 additions and 1 deletions
+22
View File
@@ -393,6 +393,28 @@ int manager_get_session_by_pidref(Manager *m, const PidRef *pid, Session **ret)
return !!s;
}
int manager_get_session_by_leader(Manager *m, const PidRef *pid, Session **ret) {
Session *s;
int r;
assert(m);
if (!pidref_is_set(pid))
return -EINVAL;
s = hashmap_get(m->sessions_by_leader, pid);
if (s) {
r = pidref_verify(pid);
if (r < 0)
return r;
}
if (ret)
*ret = s;
return !!s;
}
int manager_get_user_by_pid(Manager *m, pid_t pid, User **ret) {
_cleanup_free_ char *unit = NULL;
User *u = NULL;
+1 -1
View File
@@ -56,7 +56,7 @@ int manager_read_utmp(Manager *m) {
if (isempty(t))
continue;
if (manager_get_session_by_pidref(m, &PIDREF_MAKE_FROM_PID(u->ut_pid), &s) <= 0)
if (manager_get_session_by_leader(m, &PIDREF_MAKE_FROM_PID(u->ut_pid), &s) <= 0)
continue;
if (s->tty_validity == TTY_FROM_UTMP && !streq_ptr(s->tty, t)) {
+1
View File
@@ -163,6 +163,7 @@ int manager_get_idle_hint(Manager *m, dual_timestamp *t);
int manager_get_user_by_pid(Manager *m, pid_t pid, User **user);
int manager_get_session_by_pidref(Manager *m, const PidRef *pid, Session **ret);
int manager_get_session_by_leader(Manager *m, const PidRef *pid, Session **ret);
bool manager_is_lid_closed(Manager *m);
bool manager_is_docked_or_external_displays(Manager *m);