]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Add json_variant_unref_and_replace and use it where appropriate
authorZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Thu, 7 May 2026 20:53:27 +0000 (22:53 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@amutable.com>
Fri, 8 May 2026 09:36:43 +0000 (11:36 +0200)
JSON_VARIANT_REPLACE is similar, but doesn't try to nullify the second
arg, so it can be used with an inline expression.

src/home/homectl.c
src/home/user-record-util.c
src/libsystemd/sd-json/json-util.h
src/libsystemd/sd-json/sd-json.c
src/libsystemd/sd-json/test-json.c
src/libsystemd/sd-varlink/sd-varlink.c
src/resolve/resolvectl.c
src/resolve/resolved-manager.c
src/shared/user-record.c

index ce54da0d8c2b72f255627659941c9175e6a8c16b..80ee6e2155a94fc5ad3274250253467765bf614a 100644 (file)
@@ -1038,8 +1038,7 @@ static int apply_identity_changes(sd_json_variant **_v) {
                         if (r < 0)
                                 return log_error_errno(r, "Failed to allocate new perMachine array: %m");
 
-                        sd_json_variant_unref(per_machine);
-                        per_machine = TAKE_PTR(npm);
+                        json_variant_unref_and_replace(per_machine, npm);
                 } else {
                         _cleanup_(sd_json_variant_unrefp) sd_json_variant *positive = sd_json_variant_ref(arg_identity_extra_this_machine),
                                 *negative = sd_json_variant_ref(arg_identity_extra_other_machines);
@@ -1122,10 +1121,7 @@ static int apply_identity_changes(sd_json_variant **_v) {
                 }
         }
 
-        sd_json_variant_unref(*_v);
-        *_v = TAKE_PTR(v);
-
-        return 0;
+        return json_variant_unref_and_replace(*_v, v);
 }
 
 static int add_disposition(sd_json_variant **v) {
index b27d993922a603e78cd5701ee465d211c43681be..b419a85b6842d69dd1c57cb0d3e0fe299295f016 100644 (file)
@@ -376,8 +376,7 @@ int user_record_add_binding(
                         if (r < 0)
                                 return r;
 
-                        sd_json_variant_unref(new_binding_entry);
-                        new_binding_entry = TAKE_PTR(be);
+                        json_variant_unref_and_replace(new_binding_entry, be);
                 }
         }
 
@@ -787,12 +786,8 @@ int user_record_update_last_changed(UserRecord *h, bool with_password) {
         }
 
         h->last_change_usec = n;
-
-        sd_json_variant_unref(h->json);
-        h->json = TAKE_PTR(v);
-
         h->mask |= USER_RECORD_REGULAR;
-        return 0;
+        return json_variant_unref_and_replace(h->json, v);
 }
 
 int user_record_make_hashed_password(UserRecord *h, char **secret, bool extend) {
@@ -1131,12 +1126,8 @@ int user_record_set_password_change_now(UserRecord *h, int b) {
                 SET_FLAG(h->mask, USER_RECORD_PER_MACHINE, !sd_json_variant_is_blank_array(array));
         }
 
-        sd_json_variant_unref(h->json);
-        h->json = TAKE_PTR(w);
-
         h->password_change_now = b;
-
-        return 0;
+        return json_variant_unref_and_replace(h->json, w);
 }
 
 int user_record_merge_secret(UserRecord *h, UserRecord *secret) {
@@ -1227,14 +1218,10 @@ int user_record_good_authentication(UserRecord *h) {
         if (r < 0)
                 return r;
 
-        sd_json_variant_unref(h->json);
-        h->json = TAKE_PTR(v);
-
         h->good_authentication_counter = counter;
         h->last_good_authentication_usec = usec;
-
         h->mask |= USER_RECORD_STATUS;
-        return 0;
+        return json_variant_unref_and_replace(h->json, v);
 }
 
 int user_record_bad_authentication(UserRecord *h) {
@@ -1282,14 +1269,10 @@ int user_record_bad_authentication(UserRecord *h) {
         if (r < 0)
                 return r;
 
-        sd_json_variant_unref(h->json);
-        h->json = TAKE_PTR(v);
-
         h->bad_authentication_counter = counter;
         h->last_bad_authentication_usec = usec;
-
         h->mask |= USER_RECORD_STATUS;
-        return 0;
+        return json_variant_unref_and_replace(h->json, v);
 }
 
 int user_record_ratelimit(UserRecord *h) {
@@ -1344,13 +1327,10 @@ int user_record_ratelimit(UserRecord *h) {
         if (r < 0)
                 return r;
 
-        sd_json_variant_unref(h->json);
-        h->json = TAKE_PTR(v);
-
         h->ratelimit_begin_usec = new_ratelimit_begin_usec;
         h->ratelimit_count = new_ratelimit_count;
-
         h->mask |= USER_RECORD_STATUS;
+        json_variant_unref_and_replace(h->json, v);
         return 1;
 }
 
index 0db1e445e62ac08c95e31d8b7c9221ea7d103484..6f06f6fb635002b2ed29cb374de5cf3c44ec2b3b 100644 (file)
@@ -9,14 +9,17 @@
 #include "sd-forward.h"
 #include "string-util.h"        /* IWYU pragma: keep */
 
-#define JSON_VARIANT_REPLACE(v, q)        \
-        do {                              \
-                typeof(v)* _v = &(v);     \
-                typeof(q) _q = (q);       \
+#define JSON_VARIANT_REPLACE(v, q)           \
+        do {                                 \
+                typeof(v)* _v = &(v);        \
+                typeof(q) _q = (q);          \
                 sd_json_variant_unref(*_v);  \
-                *_v = _q;                 \
+                *_v = _q;                    \
         } while(false)
 
+#define json_variant_unref_and_replace(a, b) \
+        free_and_replace_full(a, b, sd_json_variant_unref)
+
 static inline int json_variant_set_field_non_null(sd_json_variant **v, const char *field, sd_json_variant *value) {
         return value && !sd_json_variant_is_null(value) ? sd_json_variant_set_field(v, field, value) : 0;
 }
index 659dffb2bac7e2947575855310018ba288cc70a9..fe8b8225c96d3cdaac571f232ae46ebd0682285a 100644 (file)
@@ -1974,7 +1974,7 @@ _public_ int sd_json_variant_filter(sd_json_variant **v, char **to_remove) {
                 return r;
 
         json_variant_propagate_sensitive(*v, w);
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(w));
+        json_variant_unref_and_replace(*v, w);
 
         return (int) n;
 }
@@ -2043,7 +2043,7 @@ _public_ int sd_json_variant_set_field(sd_json_variant **v, const char *field, s
                 return r;
 
         json_variant_propagate_sensitive(*v, w);
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(w));
+        json_variant_unref_and_replace(*v, w);
 
         return 1;
 }
@@ -2183,7 +2183,7 @@ _public_ int sd_json_variant_merge_object(sd_json_variant **v, sd_json_variant *
 
         json_variant_propagate_sensitive(*v, w);
         json_variant_propagate_sensitive(m, w);
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(w));
+        json_variant_unref_and_replace(*v, w);
 
         return 1;
 }
@@ -2262,9 +2262,7 @@ _public_ int sd_json_variant_append_array(sd_json_variant **v, sd_json_variant *
         }
 
         json_variant_propagate_sensitive(*v, nv);
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(nv));
-
-        return 0;
+        return json_variant_unref_and_replace(*v, nv);
 }
 
 _public_ int sd_json_variant_append_arrayb(sd_json_variant **v, ...) {
@@ -2511,7 +2509,7 @@ static int json_variant_set_source(sd_json_variant **v, JsonSource *source, unsi
         w->line = line;
         w->column = column;
 
-        JSON_VARIANT_REPLACE(*v, w);
+        json_variant_unref_and_replace(*v, w);
 
         return 1;
 }
@@ -5855,7 +5853,7 @@ _public_ int sd_json_variant_sort(sd_json_variant **v) {
         if (!n->sorted) /* Check if this worked. This will fail if there are multiple identical keys used. */
                 return -ENOTUNIQ;
 
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(n));
+        json_variant_unref_and_replace(*v, n);
 
         return 1;
 }
@@ -5910,7 +5908,7 @@ _public_ int sd_json_variant_normalize(sd_json_variant **v) {
                 goto finish;
         }
 
-        JSON_VARIANT_REPLACE(*v, TAKE_PTR(n));
+        json_variant_unref_and_replace(*v, n);
 
         r = 1;
 
index 1785ef416f5b17ffb452d45ddf4cc9d8bc4083f0..3be4b09660b140157c2dbd1cab326abf819d89b7 100644 (file)
@@ -548,8 +548,7 @@ TEST(depth) {
 
                 assert_se(r >= 0);
 
-                sd_json_variant_unref(v);
-                v = TAKE_PTR(w);
+                json_variant_unref_and_replace(v, w);
         }
 
         sd_json_variant_dump(v, 0, stdout, NULL);
index 2a5f677ef37d0f3fa15819ff1d94953a62f4d094..8e43e38800bde70b2cff77fa2c086fef7b295e44 100644 (file)
@@ -772,10 +772,7 @@ static int varlink_sanitize_incoming_parameters(sd_json_variant **v) {
                 r = sd_json_variant_new_object(&empty, NULL, 0);
                 if (r < 0)
                         return r;
-                /* sd_json_variant_unref() is a NOP if *v is NULL */
-                sd_json_variant_unref(*v);
-                *v = TAKE_PTR(empty);
-                return 0;
+                return json_variant_unref_and_replace(*v, empty);
         }
 
         /* Ensure we have an object */
index 015345fdba7d9e288059fd88b58f4465f88ad973..e8ae7c5412acc724c61da143fb0490024f66c82e 100644 (file)
@@ -1251,8 +1251,7 @@ static int status_json_filter_links(sd_json_variant **configuration, char **link
                         return r;
         }
 
-        JSON_VARIANT_REPLACE(*configuration, TAKE_PTR(v));
-        return 0;
+        return json_variant_unref_and_replace(*configuration, v);
 }
 
 static int status_json_filter_fields(sd_json_variant **configuration, StatusMode mode) {
@@ -1281,8 +1280,7 @@ static int status_json_filter_fields(sd_json_variant **configuration, StatusMode
                         return r;
         }
 
-        JSON_VARIANT_REPLACE(*configuration, TAKE_PTR(v));
-        return 0;
+        return json_variant_unref_and_replace(*configuration, v);
 }
 
 static int format_dns_server_one(DNSConfiguration *configuration, DNSServer *s, char **ret) {
index 0a52e922c4ff5472911b79658bdbc301a2d3ab0c..d7d707726587d520f5bdfb416a5dfef623d4c4ad 100644 (file)
@@ -2335,7 +2335,7 @@ int manager_send_dns_configuration_changed(Manager *m, Link *l, bool reset) {
         if (sd_json_variant_equal(configuration, m->dns_configuration_json))
                 return 0;
 
-        JSON_VARIANT_REPLACE(m->dns_configuration_json, TAKE_PTR(configuration));
+        json_variant_unref_and_replace(m->dns_configuration_json, configuration);
 
         r = varlink_many_notify(m->varlink_dns_configuration_subscription, m->dns_configuration_json);
         if (r < 0)
index 191870c8ea62de53fa45e5730d26ebda8005368b..7c64171bf58ec51ee0c2317aba9fc5b5a390f315 100644 (file)
@@ -2374,8 +2374,7 @@ static int remove_self_modifiable_json_fields_common(UserRecord *current, sd_jso
                         return r;
         }
 
-        JSON_VARIANT_REPLACE(*target, TAKE_PTR(v));
-        return 0;
+        return json_variant_unref_and_replace(*target, v);
 }
 
 static int remove_self_modifiable_json_fields(UserRecord *current, UserRecord *h, sd_json_variant **ret) {
@@ -2460,8 +2459,7 @@ static int remove_self_modifiable_json_fields(UserRecord *current, UserRecord *h
                         return r;
         }
 
-        JSON_VARIANT_REPLACE(*ret, TAKE_PTR(v));
-        return 0;
+        return json_variant_unref_and_replace(*ret, v);
 }
 
 int user_record_self_changes_allowed(UserRecord *current, UserRecord *incoming) {