]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: never consider service idle if polkit authentication is still pending
authorLennart Poettering <lennart@poettering.net>
Thu, 23 May 2024 07:46:04 +0000 (09:46 +0200)
committerLuca Boccassi <bluca@debian.org>
Tue, 11 Jun 2024 22:17:38 +0000 (23:17 +0100)
Let's be correct on this.

src/import/importd.c
src/locale/localed.c
src/machine/machined.c
src/portable/portabled.c
src/timedate/timedated.c

index 3bfa3cdd75215e1577d85d390ae496fbb84259e6..2ecffdec4ed92d09f4a659e9362b42d9c037a051 100644 (file)
@@ -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) {
index c0d104578d468f7ab1cc43f6146127e361019a58..062744519db3c7092cf83571859ebc8efc587c73 100644 (file)
@@ -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");
 
index d7087e4672c743c7c77c6f5b53b25d19e3419c76..398375bc5e29963cb70eaa4eaf9524b8e4d3738c 100644 (file)
@@ -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);
index d46ac018a308bcd91ae9966ee5b513a8a1475606..0286bf59e7571b0b1ec5525e04ca2a6f4a5771bc 100644 (file)
@@ -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[]) {
index e3b4367ec0536180d4e6dc5920ab62b47e4dc72c..b4cc5f9dd5f1fc5e3df542aeea531c0278b89dfd 100644 (file)
@@ -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");