]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-server: use hashmap_ensure_put()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 11 Aug 2021 06:25:20 +0000 (15:25 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 11 Aug 2021 07:43:25 +0000 (16:43 +0900)
src/libsystemd-network/dhcp-server-internal.h
src/libsystemd-network/fuzz-dhcp-server.c
src/libsystemd-network/sd-dhcp-server.c

index 34928e0286901b2e3da573c4b72951e944eaab03..54586e662d83e86e47aff93621fdc77a2dc88b38 100644 (file)
@@ -96,6 +96,8 @@ typedef struct DHCPRequest {
         const uint8_t *agent_info_option;
 } DHCPRequest;
 
+extern const struct hash_ops dhcp_lease_hash_ops;
+
 int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message,
                                size_t length);
 int dhcp_server_send_packet(sd_dhcp_server *server,
index c854d921c00eb09ceabf809170cf76ad18662bd2..94a8faaa39cbd99fdb5d478d3d887275d8903f39 100644 (file)
@@ -48,7 +48,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
         memcpy(lease->chaddr, chaddr, 16);
         pool_offset = get_pool_offset(server, lease->address);
         server->bound_leases[pool_offset] = lease;
-        assert_se(hashmap_put(server->leases_by_client_id, &lease->client_id, lease) >= 0);
+        assert_se(hashmap_ensure_put(&server->leases_by_client_id, &dhcp_lease_hash_ops, &lease->client_id, lease) >= 0);
 
         (void) dhcp_server_handle_message(server, (DHCPMessage*)data, size);
 
index e2ea79f58414b31dae29084d3583b25cfb0b540c..fa3d3620b4058ad5266ee0743e510d6cd94b2cf0 100644 (file)
@@ -144,8 +144,13 @@ int client_id_compare_func(const DHCPClientId *a, const DHCPClientId *b) {
         return memcmp(a->data, b->data, a->length);
 }
 
-DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(dhcp_lease_hash_ops, DHCPClientId, client_id_hash_func, client_id_compare_func,
-                                              DHCPLease, dhcp_lease_free);
+DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
+        dhcp_lease_hash_ops,
+        DHCPClientId,
+        client_id_hash_func,
+        client_id_compare_func,
+        DHCPLease,
+        dhcp_lease_free);
 
 static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) {
         assert(server);
@@ -201,13 +206,6 @@ int sd_dhcp_server_new(sd_dhcp_server **ret, int ifindex) {
                 .max_lease_time = DIV_ROUND_UP(DHCP_MAX_LEASE_TIME_USEC, USEC_PER_SEC),
         };
 
-        server->leases_by_client_id = hashmap_new(&dhcp_lease_hash_ops);
-        if (!server->leases_by_client_id)
-                return -ENOMEM;
-        server->static_leases_by_client_id = hashmap_new(&dhcp_lease_hash_ops);
-        if (!server->static_leases_by_client_id)
-                return -ENOMEM;
-
         *ret = TAKE_PTR(server);
 
         return 0;
@@ -1025,7 +1023,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, siz
                         server->bound_leases[pool_offset] = lease;
 
                         old_lease = hashmap_remove(server->leases_by_client_id, &lease->client_id);
-                        r = hashmap_put(server->leases_by_client_id, &lease->client_id, lease);
+                        r = hashmap_ensure_put(&server->leases_by_client_id, &dhcp_lease_hash_ops, &lease->client_id, lease);
                         if (r < 0)
                                 return log_dhcp_server_errno(server, r, "Could not save lease: %m");
                         TAKE_PTR(lease);
@@ -1066,7 +1064,7 @@ int dhcp_server_handle_message(sd_dhcp_server *server, DHCPMessage *message, siz
                         log_dhcp_server(server, "ACK (0x%x)", be32toh(req->message->xid));
 
                         server->bound_leases[pool_offset] = lease;
-                        r = hashmap_put(server->leases_by_client_id, &lease->client_id, lease);
+                        r = hashmap_ensure_put(&server->leases_by_client_id, &dhcp_lease_hash_ops, &lease->client_id, lease);
                         if (r < 0)
                                 return log_dhcp_server_errno(server, r, "Could not save lease: %m");
                         TAKE_PTR(new_lease);