]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-varlink: pin error message while we invoke a reply callback
authorLennart Poettering <lennart@amutable.com>
Fri, 6 Mar 2026 10:39:28 +0000 (11:39 +0100)
committerMike Yuan <me@yhndnzj.com>
Fri, 6 Mar 2026 13:51:35 +0000 (14:51 +0100)
Let's make sure the parameters/error pointers into the message remain
valid as long as the reply callback is running, even if the reply
otherwise resets the pending message.

src/libsystemd/sd-varlink/sd-varlink.c

index f868f11850b573b51e0cac1c2e8c8a056af442a1..7ee85e978954209d003bb2eecab1380432a4634a 100644 (file)
@@ -1135,9 +1135,8 @@ static int varlink_sanitize_incoming_parameters(sd_json_variant **v) {
 }
 
 static int varlink_dispatch_reply(sd_varlink *v) {
-        _cleanup_(sd_json_variant_unrefp) sd_json_variant *parameters = NULL;
+        _cleanup_(sd_json_variant_unrefp) sd_json_variant *parameters = NULL, *error = NULL;
         sd_varlink_reply_flags_t flags = 0;
-        const char *error = NULL;
         sd_json_variant *e;
         const char *k;
         int r;
@@ -1162,7 +1161,7 @@ static int varlink_dispatch_reply(sd_varlink *v) {
                         if (!sd_json_variant_is_string(e))
                                 goto invalid;
 
-                        error = sd_json_variant_string(e);
+                        error = sd_json_variant_ref(e);
                         flags |= SD_VARLINK_REPLY_ERROR;
 
                 } else if (streq(k, "parameters")) {
@@ -1204,7 +1203,7 @@ static int varlink_dispatch_reply(sd_varlink *v) {
                 varlink_set_state(v, VARLINK_PROCESSING_REPLY);
 
                 if (v->reply_callback) {
-                        r = v->reply_callback(v, parameters, error, flags, v->userdata);
+                        r = v->reply_callback(v, parameters, sd_json_variant_string(error), flags, v->userdata);
                         if (r < 0)
                                 varlink_log_errno(v, r, "Reply callback returned error, ignoring: %m");
                 }