From 3f0aa5852ec4f53f7412cd8b86fd9d064bebd108 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Fri, 22 May 2026 09:13:55 -0700 Subject: [PATCH] libsystemd-network: propagate sd_event_default() failure Four *_attach_event helpers swallow sd_event_default() failures and return success while leaving obj->event NULL: sd_dhcp_client_attach_event (sd-dhcp-client.c) sd_dhcp6_client_attach_event (sd-dhcp6-client.c) sd_ndisc_attach_event (sd-ndisc.c) sd_radv_attach_event (sd-radv.c) Each contains the same copy-pasted typo in the NULL-event branch: r = sd_event_default(&obj->event); if (r < 0) return 0; /* swallows -ENOMEM / -ECHILD */ The caller is told the attach succeeded, but obj->event is still NULL. A subsequent *_start() then trips assert_return(obj->event, -EINVAL) and returns a spurious -EINVAL (or aborts on assert-abort builds), and any consumer of *_get_event() dereferences NULL. The sibling helper sd_dhcp_server_attach_event already uses the correct pattern: r = sd_event_default(&server->event); if (r < 0) return r; Fix by returning r instead of 0 at each of the four sites so the sd_event_default() errno is propagated to the caller and ownership stays with the caller. Assisted-by: kres (claude-opus-4-7) Signed-off-by: Chris Mason --- src/libsystemd-network/sd-dhcp-client.c | 2 +- src/libsystemd-network/sd-dhcp6-client.c | 2 +- src/libsystemd-network/sd-ndisc.c | 2 +- src/libsystemd-network/sd-radv.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 5675c7d7875..c6e73dbab0f 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -1350,7 +1350,7 @@ int sd_dhcp_client_attach_event(sd_dhcp_client *client, sd_event *event, int64_t else { r = sd_event_default(&client->event); if (r < 0) - return 0; + return r; } client->event_priority = priority; diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index e2415a5b474..b78d1c29ecd 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -1507,7 +1507,7 @@ int sd_dhcp6_client_attach_event(sd_dhcp6_client *client, sd_event *event, int64 else { r = sd_event_default(&client->event); if (r < 0) - return 0; + return r; } client->event_priority = priority; diff --git a/src/libsystemd-network/sd-ndisc.c b/src/libsystemd-network/sd-ndisc.c index b6a55a50955..51e12d45287 100644 --- a/src/libsystemd-network/sd-ndisc.c +++ b/src/libsystemd-network/sd-ndisc.c @@ -137,7 +137,7 @@ int sd_ndisc_attach_event(sd_ndisc *nd, sd_event *event, int64_t priority) { else { r = sd_event_default(&nd->event); if (r < 0) - return 0; + return r; } nd->event_priority = priority; diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 948f7bc382c..df5fcc6c02e 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -58,7 +58,7 @@ int sd_radv_attach_event(sd_radv *ra, sd_event *event, int64_t priority) { else { r = sd_event_default(&ra->event); if (r < 0) - return 0; + return r; } ra->event_priority = priority; -- 2.47.3