]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-json: parse uid_t/gid_t as uint32_t first
authorLennart Poettering <lennart@poettering.net>
Fri, 24 Oct 2025 09:09:01 +0000 (11:09 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 1 Nov 2025 20:43:37 +0000 (21:43 +0100)
Let's use the proper uint32_t parsers initially, so that the usual logic
of formatting integers as decimal strings, works too for uids/gids. Not
because it made any sense to encode them like that, but just to be
systematic here.

src/libsystemd/sd-json/sd-json.c

index b13960897eda247788cda5b481ed41a3fdfded83..a69fb2ae111c12cdbc20e3070471ca0a26c18340 100644 (file)
@@ -5676,7 +5676,8 @@ _public_ int sd_json_dispatch_variant_noref(const char *name, sd_json_variant *v
 
 _public_ int sd_json_dispatch_uid_gid(const char *name, sd_json_variant *variant, sd_json_dispatch_flags_t flags, void *userdata) {
         uid_t *uid = userdata;
-        uint64_t k;
+        uint32_t k;
+        int r;
 
         assert_return(variant, -EINVAL);
         assert_return(userdata, -EINVAL);
@@ -5693,11 +5694,10 @@ _public_ int sd_json_dispatch_uid_gid(const char *name, sd_json_variant *variant
                 return 0;
         }
 
-        if (!sd_json_variant_is_unsigned(variant))
-                return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not an integer.", strna(name));
-
-        k = sd_json_variant_unsigned(variant);
-        if (k > UINT32_MAX || !uid_is_valid(k))
+        r = sd_json_dispatch_uint32(name, variant, flags, &k);
+        if (r < 0)
+                return r;
+        if (!uid_is_valid(k))
                 return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "JSON field '%s' is not a valid UID/GID.", strna(name));
 
         *uid = k;