]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: tag dynamic user userdb provider with dynamic uid/gid ranges
authorLennart Poettering <lennart@amutable.com>
Fri, 10 Jul 2026 04:31:30 +0000 (06:31 +0200)
committerLennart Poettering <lennart@amutable.com>
Sun, 12 Jul 2026 21:09:01 +0000 (23:09 +0200)
Let's optimize lookups to PID 1's dynamic UID/GID range feature.

src/core/varlink.c

index fa6a5e15656938b675289a3b634fa0143d56bc66..79a198f14d79874622be31163e6889bf705d57ad 100644 (file)
@@ -4,12 +4,14 @@
 
 #include "constants.h"
 #include "errno-util.h"
+#include "format-util.h"
 #include "job.h"
 #include "json-util.h"
 #include "manager.h"
 #include "metrics.h"
 #include "path-util.h"
 #include "pidref.h"
+#include "stdio-util.h"
 #include "string-util.h"
 #include "strv.h"
 #include "unit.h"
@@ -27,6 +29,7 @@
 #include "varlink-serialize.h"
 #include "varlink-unit.h"
 #include "varlink-util.h"
+#include "xattr-util.h"
 
 static const char* const managed_oom_mode_properties[] = {
         "ManagedOOMSwap",
@@ -481,10 +484,14 @@ int manager_setup_varlink_metrics_server(Manager *m) {
         if (MANAGER_IS_SYSTEM(m))
                 flags |= SD_VARLINK_SERVER_ACCOUNT_UID;
 
-        return metrics_setup_varlink_server(&m->metrics_varlink_server, flags,
-                                            m->event, EVENT_PRIORITY_IPC,
-                                            vl_method_list_metrics, vl_method_describe_metrics,
-                                            m);
+        return metrics_setup_varlink_server(
+                        &m->metrics_varlink_server,
+                        flags,
+                        m->event,
+                        EVENT_PRIORITY_IPC,
+                        vl_method_list_metrics,
+                        vl_method_describe_metrics,
+                        m);
 }
 
 static int varlink_server_listen_many_idempotent_sentinel(
@@ -549,6 +556,12 @@ static int manager_varlink_init_system_api(Manager *m) {
                                 VARLINK_PATH_MANAGED_OOM_SYSTEM);
                 if (r < 0)
                         return r;
+
+                /* Reduce the noise routed to us: advertise that only look-ups for the dynamic UID range should go to us */
+                char text[DECIMAL_STR_MAX(uid_t) + 1 + DECIMAL_STR_MAX(gid_t) + 1];
+                xsprintf(text, UID_FMT "-" UID_FMT, (uid_t) DYNAMIC_UID_MIN, (uid_t) DYNAMIC_UID_MAX);
+                FOREACH_STRING(xattr, "user.userdb.uid", "user.userdb.gid")
+                        (void) xsetxattr(AT_FDCWD, "/run/systemd/userdb/io.systemd.DynamicUser", /* at_flags= */ 0, xattr, text);
         }
 
         return 0;