]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
libsystemd-network: propagate sd_event_default() failure 42263/head
authorChris Mason <clm@meta.com>
Fri, 22 May 2026 16:13:55 +0000 (09:13 -0700)
committerLennart Poettering <lennart@amutable.com>
Fri, 22 May 2026 20:20:03 +0000 (22:20 +0200)
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 <clm@meta.com>
src/libsystemd-network/sd-dhcp-client.c
src/libsystemd-network/sd-dhcp6-client.c
src/libsystemd-network/sd-ndisc.c
src/libsystemd-network/sd-radv.c

index 5675c7d78755be91724ad8b2dc71f7840ab14d5e..c6e73dbab0f63572ace036f899a79517b10e3e14 100644 (file)
@@ -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;
index e2415a5b4744892827f8a1034e4b30f58f740cfc..b78d1c29ecd29aa0ae0c20d2f59d4428e346dcca 100644 (file)
@@ -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;
index b6a55a5095547f4f1cf848d5bb21c5edd6cf9a59..51e12d45287a795f2599ac81cbe4b2187846f78f 100644 (file)
@@ -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;
index 948f7bc382cd64c418089736c7c79f9b25368d88..df5fcc6c02ebeff273a9f064713a2e02004dc9c8 100644 (file)
@@ -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;