]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp-server-request: check server address in DHCPDECLINE and DHCPRELEASE 42235/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 7 May 2026 03:19:25 +0000 (12:19 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 21 May 2026 19:30:34 +0000 (04:30 +0900)
Otherwise, we may do something wrong by messages for another DHCP server.
Let's silently ignore messages with unmatching server identifier.

Also, logs something when we receive DHCPRELEASE but found lease does
not match the reported address.

src/libsystemd-network/dhcp-server-request.c

index 202a8b888cd05f399e5673a90a8aeffa19b535b5..6ce68dab40d307d46f7dfa09aca438c2a6f0a20a 100644 (file)
@@ -364,10 +364,12 @@ static int dhcp_server_process_decline(sd_dhcp_server *server, DHCPRequest *req,
         assert(server);
         assert(req);
 
-        log_dhcp_server(server, "DECLINE (0x%x): %s", be32toh(req->message->xid), strna(error_message));
+        if (req->server_address != server->address)
+                return 0; /* The message is not for us. Let's silently ignore the packet. */
 
-        /* TODO: make sure we don't offer this address again */
+        /* TODO: make sure we don't offer this address again for a while. */
 
+        log_dhcp_server(server, "DECLINE (0x%x): %s", be32toh(req->message->xid), strna(error_message));
         return 0;
 }
 
@@ -375,19 +377,20 @@ static int dhcp_server_process_release(sd_dhcp_server *server, DHCPRequest *req)
         assert(server);
         assert(req);
 
-        log_dhcp_server(server, "RELEASE (0x%x)",
-                        be32toh(req->message->xid));
+        if (req->server_address != server->address)
+                return 0; /* The message is not for us. Let's silently ignore the packet. */
 
         sd_dhcp_server_lease *existing_lease = hashmap_get(server->bound_leases_by_client_id, &req->client_id);
         if (!existing_lease)
                 return 0;
 
         if (existing_lease->address != req->message->ciaddr)
-                return 0;
+                return -EBADMSG;
 
         sd_dhcp_server_lease_unref(existing_lease);
         dhcp_server_on_lease_change(server);
 
+        log_dhcp_server(server, "RELEASE (0x%x)", be32toh(req->message->xid));
         return 0;
 }