]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-client: propagate errors in client_initialize_{io,time}_events() 41256/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 14 Mar 2026 12:59:42 +0000 (21:59 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 21 Mar 2026 18:34:43 +0000 (03:34 +0900)
Call client_stop() on error and return 0 only on callback.
Normal non-callback functions should propagate errors.

This also makes client_initialize_time_events() use
event_reset_time_relative().

src/libsystemd-network/sd-dhcp-client.c

index 683ee3d5090c29126f15f72687d87dc8bd166cf1..9dcd9859a3fd71c60a9d2f756a7bc34d32efb9d0 100644 (file)
@@ -1401,59 +1401,56 @@ static int client_initialize_io_events(
 
         assert(client);
         assert(client->event);
+        assert(io_callback);
 
-        r = sd_event_add_io(client->event, &client->receive_message,
-                            client->fd, EPOLLIN, io_callback,
-                            client);
+        _cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
+        r = sd_event_add_io(client->event, &s, client->fd, EPOLLIN, io_callback, client);
         if (r < 0)
-                goto error;
-
-        r = sd_event_source_set_priority(client->receive_message,
-                                         client->event_priority);
-        if (r < 0)
-                goto error;
+                return r;
 
-        r = sd_event_source_set_description(client->receive_message, "dhcp4-receive-message");
+        r = sd_event_source_set_priority(s, client->event_priority);
         if (r < 0)
-                goto error;
+                return r;
 
-error:
+        r = sd_event_source_set_description(s, "dhcp4-receive-message");
         if (r < 0)
-                client_stop(client, r);
+                return r;
 
+        sd_event_source_disable_unref(client->receive_message);
+        client->receive_message = TAKE_PTR(s);
         return 0;
 }
 
 static int client_initialize_time_events(sd_dhcp_client *client) {
-        usec_t usec = 0;
-        int r;
-
         assert(client);
         assert(client->event);
 
         (void) event_source_disable(client->timeout_ipv6_only_mode);
 
-        if (client->start_delay > 0) {
-                assert_se(sd_event_now(client->event, CLOCK_BOOTTIME, &usec) >= 0);
-                usec = usec_add(usec, client->start_delay);
-        }
-
-        r = event_reset_time(client->event, &client->timeout_resend,
-                             CLOCK_BOOTTIME,
-                             usec, 0,
-                             client_timeout_resend, client,
-                             client->event_priority, "dhcp4-resend-timer", true);
-        if (r < 0)
-                client_stop(client, r);
-
-        return 0;
+        return event_reset_time_relative(
+                        client->event,
+                        &client->timeout_resend,
+                        CLOCK_BOOTTIME,
+                        client->start_delay,
+                        /* accuracy= */ 0,
+                        client_timeout_resend,
+                        client,
+                        client->event_priority,
+                        "dhcp4-resend-timer",
+                        /* force_reset= */ true);
 }
 
 static int client_initialize_events(sd_dhcp_client *client, sd_event_io_handler_t io_callback) {
-        client_initialize_io_events(client, io_callback);
-        client_initialize_time_events(client);
+        int r;
 
-        return 0;
+        assert(client);
+        assert(io_callback);
+
+        r = client_initialize_io_events(client, io_callback);
+        if (r < 0)
+                return r;
+
+        return client_initialize_time_events(client);
 }
 
 static int client_start_delayed(sd_dhcp_client *client) {
@@ -1472,10 +1469,8 @@ static int client_start_delayed(sd_dhcp_client *client) {
                                          &client->hw_addr, &client->bcast_addr,
                                          client->arp_type, client->port,
                                          client->socket_priority_set, client->socket_priority);
-        if (r < 0) {
-                client_stop(client, r);
+        if (r < 0)
                 return r;
-        }
         client->fd = r;
 
         client->start_time = now(CLOCK_BOOTTIME);
@@ -1538,12 +1533,17 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata)
         }
         client->fd = r;
 
-        return client_initialize_events(client, client_receive_message_raw);
+        r = client_initialize_events(client, client_receive_message_raw);
+        if (r < 0)
+                client_stop(client, r);
+
+        return 0;
 }
 
 static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata) {
         sd_dhcp_client *client = userdata;
         DHCP_CLIENT_DONT_DESTROY(client);
+        int r;
 
         if (client->lease)
                 client_set_state(client, DHCP_STATE_RENEWING);
@@ -1552,7 +1552,11 @@ static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata)
         client->discover_attempt = 0;
         client->request_attempt = 0;
 
-        return client_initialize_time_events(client);
+        r = client_initialize_time_events(client);
+        if (r < 0)
+                client_stop(client, r);
+
+        return 0;
 }
 
 static int dhcp_option_parse_and_verify(
@@ -1976,7 +1980,9 @@ static int client_enter_bound_now(sd_dhcp_client *client, int notify_event) {
 
                 client->receive_message = sd_event_source_disable_unref(client->receive_message);
                 close_and_replace(client->fd, r);
-                client_initialize_io_events(client, client_receive_message_udp);
+                r = client_initialize_io_events(client, client_receive_message_udp);
+                if (r < 0)
+                        return r;
         }
 
         client_notify(client, notify_event);