From 48326af23a1c9d95f9aa2fd66fcecbc7f90ccff5 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Wed, 15 Apr 2026 08:02:07 +0000 Subject: [PATCH] sd-varlink: Don't log successful sentinel error dispatch as a failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sd_varlink_error() deliberately returns a negative errno mapped from the error id on success so callbacks can `return sd_varlink_error(...);` to enqueue the reply and propagate a matching errno at once. When varlink_dispatch_method() dispatches a configured error sentinel itself, it doesn't need that mapping — but it was treating any negative return as a dispatch failure and logging "Failed to process sentinel" even though the error reply had been successfully enqueued. Detect success via the state transition to VARLINK_PROCESSED_METHOD instead, so only genuine enqueue failures are logged. --- src/libsystemd/sd-varlink/sd-varlink.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libsystemd/sd-varlink/sd-varlink.c b/src/libsystemd/sd-varlink/sd-varlink.c index 372ede755b..7130be69a4 100644 --- a/src/libsystemd/sd-varlink/sd-varlink.c +++ b/src/libsystemd/sd-varlink/sd-varlink.c @@ -1110,8 +1110,18 @@ static int varlink_dispatch_method(sd_varlink *v) { * and no replies were enqueued by the callback. */ if (sentinel == POINTER_MAX) r = sd_varlink_reply(v, NULL); - else + else { r = sd_varlink_error(v, sentinel, NULL); + /* sd_varlink_error() deliberately returns a negative + * errno mapped from the error id on success (so method + * callbacks can `return sd_varlink_error(...);` to + * enqueue a reply and propagate a matching errno in one + * go). For sentinel dispatch we don't care about that + * mapping — the reply is either enqueued or not, which + * we detect via the state transition instead. */ + if (v->state == VARLINK_PROCESSED_METHOD) + r = 0; + } if (sentinel != POINTER_MAX) free(sentinel);