From ec8bbd8adb9463471803aadd9a8ba2a326d7a49d Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 23 May 2024 09:46:04 +0200 Subject: [PATCH] tree-wide: never consider service idle if polkit authentication is still pending Let's be correct on this. --- src/import/importd.c | 5 +++-- src/locale/localed.c | 14 +++++++++++++- src/machine/machined.c | 5 ++++- src/portable/portabled.c | 5 +++-- src/timedate/timedated.c | 14 +++++++++++++- 5 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/import/importd.c b/src/import/importd.c index 3bfa3cdd75..2ecffdec4e 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -1728,9 +1728,10 @@ static int manager_add_bus_objects(Manager *m) { } static bool manager_check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); - return hashmap_isempty(m->transfers); + return hashmap_isempty(m->transfers) && + hashmap_isempty(m->polkit_registry); } static void manager_parse_env(Manager *m) { diff --git a/src/locale/localed.c b/src/locale/localed.c index c0d104578d..062744519d 100644 --- a/src/locale/localed.c +++ b/src/locale/localed.c @@ -622,6 +622,12 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } +static bool context_check_idle(void *userdata) { + Context *c = ASSERT_PTR(userdata); + + return hashmap_isempty(c->polkit_registry); +} + static int run(int argc, char *argv[]) { _cleanup_(context_clear) Context context = {}; _cleanup_(sd_event_unrefp) sd_event *event = NULL; @@ -662,7 +668,13 @@ static int run(int argc, char *argv[]) { if (r < 0) log_warning_errno(r, "Failed to send readiness notification, ignoring: %m"); - r = bus_event_loop_with_idle(event, bus, "org.freedesktop.locale1", DEFAULT_EXIT_USEC, NULL, NULL); + r = bus_event_loop_with_idle( + event, + bus, + "org.freedesktop.locale1", + DEFAULT_EXIT_USEC, + context_check_idle, + &context); if (r < 0) return log_error_errno(r, "Failed to run event loop: %m"); diff --git a/src/machine/machined.c b/src/machine/machined.c index d7087e4672..398375bc5e 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -311,7 +311,7 @@ static int manager_startup(Manager *m) { } static bool check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); if (m->operations) return false; @@ -322,6 +322,9 @@ static bool check_idle(void *userdata) { if (varlink_server_current_connections(m->varlink_machine_server) > 0) return false; + if (!hashmap_isempty(m->polkit_registry)) + return false; + manager_gc(m, true); return hashmap_isempty(m->machines); diff --git a/src/portable/portabled.c b/src/portable/portabled.c index d46ac018a3..0286bf59e7 100644 --- a/src/portable/portabled.c +++ b/src/portable/portabled.c @@ -117,9 +117,10 @@ static int manager_startup(Manager *m) { } static bool check_idle(void *userdata) { - Manager *m = userdata; + Manager *m = ASSERT_PTR(userdata); - return !m->operations; + return !m->operations && + hashmap_isempty(m->polkit_registry); } static int run(int argc, char *argv[]) { diff --git a/src/timedate/timedated.c b/src/timedate/timedated.c index e3b4367ec0..b4cc5f9dd5 100644 --- a/src/timedate/timedated.c +++ b/src/timedate/timedated.c @@ -1118,6 +1118,12 @@ static int connect_bus(Context *c, sd_event *event, sd_bus **_bus) { return 0; } +static bool context_check_idle(void *userdata) { + Context *c = ASSERT_PTR(userdata); + + return hashmap_isempty(c->polkit_registry); +} + static int run(int argc, char *argv[]) { _cleanup_(context_clear) Context context = {}; _cleanup_(sd_event_unrefp) sd_event *event = NULL; @@ -1164,7 +1170,13 @@ static int run(int argc, char *argv[]) { if (r < 0) log_warning_errno(r, "Failed to send readiness notification, ignoring: %m"); - r = bus_event_loop_with_idle(event, bus, "org.freedesktop.timedate1", DEFAULT_EXIT_USEC, NULL, NULL); + r = bus_event_loop_with_idle( + event, + bus, + "org.freedesktop.timedate1", + DEFAULT_EXIT_USEC, + context_check_idle, + &context); if (r < 0) return log_error_errno(r, "Failed to run event loop: %m");