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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user