diff --git a/src/login/logind-core.c b/src/login/logind-core.c index 3c51bc4a40..2f8c7824d2 100644 --- a/src/login/logind-core.c +++ b/src/login/logind-core.c @@ -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; diff --git a/src/login/logind-utmp.c b/src/login/logind-utmp.c index 8305ae743f..2adfc08257 100644 --- a/src/login/logind-utmp.c +++ b/src/login/logind-utmp.c @@ -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)) { diff --git a/src/login/logind.h b/src/login/logind.h index 6a46374e8a..bc9ea97d80 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -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);