From: Mike Yuan Date: Thu, 12 Feb 2026 00:09:49 +0000 (+0100) Subject: sd-varlink: fail if a method call wasn't replied to and the callback didn't store it X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eeead6e1774a3022ed2983d3488d6d6f34d8a0d4;p=thirdparty%2Fsystemd.git sd-varlink: fail if a method call wasn't replied to and the callback didn't store it --- diff --git a/src/libsystemd/sd-varlink/sd-varlink.c b/src/libsystemd/sd-varlink/sd-varlink.c index 1217d1f7cfb..4e7467e6d0b 100644 --- a/src/libsystemd/sd-varlink/sd-varlink.c +++ b/src/libsystemd/sd-varlink/sd-varlink.c @@ -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; }