From: Yu Watanabe Date: Wed, 11 Aug 2021 06:25:20 +0000 (+0900) Subject: sd-dhcp-server: use hashmap_ensure_put() X-Git-Tag: v250-rc1~840^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cedf6a8da530d29149ac263075cb16fa8939398d;p=thirdparty%2Fsystemd.git sd-dhcp-server: use hashmap_ensure_put() --- diff --git a/src/libsystemd-network/dhcp-server-internal.h b/src/libsystemd-network/dhcp-server-internal.h index 34928e02869..54586e662d8 100644 --- a/src/libsystemd-network/dhcp-server-internal.h +++ b/src/libsystemd-network/dhcp-server-internal.h @@ -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, diff --git a/src/libsystemd-network/fuzz-dhcp-server.c b/src/libsystemd-network/fuzz-dhcp-server.c index c854d921c00..94a8faaa39c 100644 --- a/src/libsystemd-network/fuzz-dhcp-server.c +++ b/src/libsystemd-network/fuzz-dhcp-server.c @@ -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); diff --git a/src/libsystemd-network/sd-dhcp-server.c b/src/libsystemd-network/sd-dhcp-server.c index e2ea79f5841..fa3d3620b40 100644 --- a/src/libsystemd-network/sd-dhcp-server.c +++ b/src/libsystemd-network/sd-dhcp-server.c @@ -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);