login: Queue session for garbage collection on leader death (#36364)

This ensures sessions are cleaned up properly in case the user service
manager was manually stopped.

How to reproduce:
- Install Fedora 41
- Log in
- Run `systemctl --user exit`
- Log in again
- Run `loginctl`

Expected results:
- Only 1 `manager` session

Actual results:
- More than 1 `manager` session
This commit is contained in:
Lennart Poettering
2025-02-13 09:10:06 +01:00
committed by GitHub
+7 -1
View File
@@ -91,8 +91,13 @@ static int session_dispatch_leader_pidfd(sd_event_source *es, int fd, uint32_t r
Session *s = ASSERT_PTR(userdata);
assert(s->leader.fd == fd);
s->leader_pidfd_event_source = sd_event_source_unref(s->leader_pidfd_event_source);
session_stop(s, /* force= */ false);
session_add_to_gc_queue(s);
return 1;
}
@@ -959,7 +964,6 @@ int session_stop(Session *s, bool force) {
return 0;
s->timer_event_source = sd_event_source_unref(s->timer_event_source);
s->leader_pidfd_event_source = sd_event_source_unref(s->leader_pidfd_event_source);
if (s->seat)
seat_evict_position(s->seat, s);
@@ -1270,6 +1274,8 @@ static int session_dispatch_fifo(sd_event_source *es, int fd, uint32_t revents,
session_remove_fifo(s);
session_stop(s, /* force = */ false);
session_add_to_gc_queue(s);
return 1;
}