From: Mike Yuan Date: Sun, 24 Dec 2023 11:06:01 +0000 (+0800) Subject: logind-session: watch pidfd in session_set_leader_consume X-Git-Tag: v256-rc1~1305^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ae9073f15209b6e0acfbd23ec146c4a29b7abbe;p=thirdparty%2Fsystemd.git logind-session: watch pidfd in session_set_leader_consume --- diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index 9348ccc4dd0..15f04c4a66a 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -807,7 +807,6 @@ int session_send_create_reply(Session *s, sd_bus_error *error) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *c = NULL; _cleanup_close_ int fifo_fd = -EBADF; _cleanup_free_ char *p = NULL; - int r; assert(s); @@ -828,10 +827,6 @@ int session_send_create_reply(Session *s, sd_bus_error *error) { if (fifo_fd < 0) return fifo_fd; - r = session_watch_pidfd(s); - if (r < 0) - return r; - /* Update the session state file before we notify the client about the result. */ session_save(s); diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 31d483ff305..cdd299e0064 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -88,6 +88,38 @@ int session_new(Session **ret, Manager *m, const char *id) { return 0; } +static int session_dispatch_leader_pidfd(sd_event_source *es, int fd, uint32_t revents, void *userdata) { + Session *s = ASSERT_PTR(userdata); + + assert(s->leader.fd == fd); + session_stop(s, /* force= */ false); + + return 1; +} + +static int session_watch_pidfd(Session *s) { + int r; + + assert(s); + assert(s->manager); + assert(pidref_is_set(&s->leader)); + + if (s->leader.fd < 0) + return 0; + + r = sd_event_add_io(s->manager->event, &s->leader_pidfd_event_source, s->leader.fd, EPOLLIN, session_dispatch_leader_pidfd, s); + if (r < 0) + return r; + + r = sd_event_source_set_priority(s->leader_pidfd_event_source, SD_EVENT_PRIORITY_IMPORTANT); + if (r < 0) + return r; + + (void) sd_event_source_set_description(s->leader_pidfd_event_source, "session-pidfd"); + + return 0; +} + static void session_reset_leader(Session *s, bool keep_fdstore) { assert(s); @@ -101,6 +133,8 @@ static void session_reset_leader(Session *s, bool keep_fdstore) { if (!pidref_is_set(&s->leader)) return; + s->leader_pidfd_event_source = sd_event_source_disable_unref(s->leader_pidfd_event_source); + (void) hashmap_remove_value(s->manager->sessions_by_leader, &s->leader, s); return pidref_done(&s->leader); @@ -200,6 +234,10 @@ int session_set_leader_consume(Session *s, PidRef _leader) { s->leader = TAKE_PIDREF(pidref); + r = session_watch_pidfd(s); + if (r < 0) + return log_error_errno(r, "Failed to watch leader pidfd for session '%s': %m", s->id); + r = hashmap_ensure_put(&s->manager->sessions_by_leader, &pidref_hash_ops, &s->leader, s); if (r < 0) return r; @@ -951,7 +989,6 @@ int session_finalize(Session *s) { LOG_MESSAGE("Removed session %s.", s->id)); 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); @@ -1259,36 +1296,6 @@ static void session_remove_fifo(Session *s) { } } -static int session_dispatch_leader_pidfd(sd_event_source *es, int fd, uint32_t revents, void *userdata) { - Session *s = ASSERT_PTR(userdata); - - assert(s->leader.fd == fd); - session_stop(s, /* force= */ false); - - return 1; -} - -int session_watch_pidfd(Session *s) { - int r; - - assert(s); - - if (s->leader.fd < 0) - return 0; - - r = sd_event_add_io(s->manager->event, &s->leader_pidfd_event_source, s->leader.fd, EPOLLIN, session_dispatch_leader_pidfd, s); - if (r < 0) - return r; - - r = sd_event_source_set_priority(s->leader_pidfd_event_source, SD_EVENT_PRIORITY_IMPORTANT); - if (r < 0) - return r; - - (void) sd_event_source_set_description(s->leader_pidfd_event_source, "session-pidfd"); - - return 0; -} - bool session_may_gc(Session *s, bool drop_not_started) { int r; diff --git a/src/login/logind-session.h b/src/login/logind-session.h index eaf9b4a6493..95d49bb2241 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -146,7 +146,6 @@ void session_set_type(Session *s, SessionType t); int session_set_display(Session *s, const char *display); int session_set_tty(Session *s, const char *tty); int session_create_fifo(Session *s); -int session_watch_pidfd(Session *s); int session_start(Session *s, sd_bus_message *properties, sd_bus_error *error); int session_stop(Session *s, bool force); int session_finalize(Session *s); diff --git a/src/login/logind.c b/src/login/logind.c index 4124d3675c5..8387c026aa9 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -465,8 +465,6 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int if (r < 0) return log_warning_errno(r, "Failed to attach leader pidfd for session '%s': %m", s->id); - // FIXME: Maybe call session_watch_pidfd() here? - return 0; }