]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-varlink: fail if a method call wasn't replied to and the callback didn't store it
authorMike Yuan <me@yhndnzj.com>
Thu, 12 Feb 2026 00:09:49 +0000 (01:09 +0100)
committerMike Yuan <me@yhndnzj.com>
Mon, 16 Feb 2026 08:44:56 +0000 (09:44 +0100)
src/libsystemd/sd-varlink/sd-varlink.c

index 1217d1f7cfb3016a7744ebc21f3278b2051e8a23..4e7467e6d0bcb0745cc07757eadaf78fa45b698c 100644 (file)
@@ -1583,7 +1583,7 @@ static int varlink_dispatch_method(sd_varlink *v) {
                         r = callback(v, parameters, flags, v->userdata);
                         if (VARLINK_STATE_WANTS_REPLY(v->state)) {
                                 if (r < 0) {
-                                        varlink_log_errno(v, r, "Callback for %s returned error: %m", method);
+                                        varlink_log_errno(v, r, "Callback for '%s' returned error: %m", method);
 
                                         /* We got an error back from the callback. Propagate it to the client
                                          * if the method call remains unanswered. */
@@ -1612,6 +1612,16 @@ static int varlink_dispatch_method(sd_varlink *v) {
                                                 varlink_log_errno(v, r, "Failed to process sentinel for method '%s': %m", method);
                                 } else {
                                         assert(!v->previous);
+
+                                        /* We're at the bare minimum referenced by sd_varlink_server and
+                                         * sd_varlink_process() */
+                                        if (v->n_ref <= 2) {
+                                                r = varlink_log_errno(v, SYNTHETIC_ERRNO(EPROTO),
+                                                                      "Callback for method '%s' returned without enqueuing a reply or stashing connection, failing.",
+                                                                      method);
+                                                goto fail;
+                                        }
+
                                         r = 0;
                                 }