dhcp: random trivial cleanups (#42061)
This commit is contained in:
@@ -40,11 +40,7 @@ struct sd_dhcp_lease {
|
||||
be32_t address;
|
||||
be32_t server_address;
|
||||
be32_t next_server;
|
||||
|
||||
bool have_subnet_mask;
|
||||
be32_t subnet_mask;
|
||||
|
||||
bool have_broadcast;
|
||||
be32_t broadcast;
|
||||
|
||||
struct in_addr *router;
|
||||
|
||||
@@ -132,4 +132,9 @@ enum {
|
||||
DHCP_FQDN_FLAG_N = (1 << 3),
|
||||
};
|
||||
|
||||
/* For SD_DHCP_RELAY_AGENT_FLAGS sub-option. */
|
||||
enum {
|
||||
DHCP_RELAY_AGENT_FLAG_UNICAST = 1 << 0,
|
||||
};
|
||||
|
||||
DECLARE_STRING_TABLE_LOOKUP_TO_STRING(dhcp_option_code, int);
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <net/if_arp.h>
|
||||
|
||||
#include "sd-event.h"
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "dhcp-server-internal.h"
|
||||
#include "dhcp-server-lease-internal.h"
|
||||
#include "fd-util.h"
|
||||
#include "fuzz.h"
|
||||
#include "hashmap.h"
|
||||
#include "rm-rf.h"
|
||||
#include "sd-dhcp-server.c"
|
||||
#include "tests.h"
|
||||
#include "tmpfile-util.h"
|
||||
|
||||
/* stub out network so that the server doesn't send */
|
||||
ssize_t sendto(int __fd, const void *__buf, size_t __n, int flags, const struct sockaddr *__addr, socklen_t __addr_len) {
|
||||
return __n;
|
||||
}
|
||||
|
||||
ssize_t sendmsg(int __fd, const struct msghdr *__message, int flags) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_lease(sd_dhcp_server *server, const struct in_addr *server_address, uint8_t i) {
|
||||
_cleanup_(sd_dhcp_server_lease_unrefp) sd_dhcp_server_lease *lease = NULL;
|
||||
int r;
|
||||
@@ -64,43 +61,41 @@ static int add_static_lease(sd_dhcp_server *server, uint8_t i) {
|
||||
}
|
||||
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
_cleanup_(rm_rf_physical_and_freep) char *tmpdir = NULL;
|
||||
_cleanup_(sd_dhcp_server_unrefp) sd_dhcp_server *server = NULL;
|
||||
struct in_addr address = { .s_addr = htobe32(UINT32_C(10) << 24 | UINT32_C(1))};
|
||||
_cleanup_free_ uint8_t *duped = NULL;
|
||||
_cleanup_close_ int dir_fd = -EBADF;
|
||||
|
||||
if (size < sizeof(DHCPMessage))
|
||||
return 0;
|
||||
|
||||
fuzz_setup_logging();
|
||||
|
||||
assert_se(duped = memdup(data, size));
|
||||
_cleanup_(rm_rf_physical_and_freep) char *tmpdir = NULL;
|
||||
_cleanup_close_ int dir_fd = ASSERT_OK(mkdtemp_open(NULL, 0, &tmpdir));
|
||||
|
||||
dir_fd = mkdtemp_open(NULL, 0, &tmpdir);
|
||||
assert_se(dir_fd >= 0);
|
||||
_cleanup_(sd_event_unrefp) sd_event *event = NULL;
|
||||
ASSERT_OK(sd_event_new(&event));
|
||||
|
||||
assert_se(sd_dhcp_server_new(&server, 1) >= 0);
|
||||
assert_se(sd_dhcp_server_attach_event(server, NULL, 0) >= 0);
|
||||
assert_se(sd_dhcp_server_set_lease_file(server, dir_fd, "leases") >= 0);
|
||||
server->fd = open("/dev/null", O_RDWR|O_CLOEXEC|O_NOCTTY);
|
||||
assert_se(server->fd >= 0);
|
||||
assert_se(sd_dhcp_server_configure_pool(server, &address, 24, 0, 0) >= 0);
|
||||
_cleanup_(sd_dhcp_server_unrefp) sd_dhcp_server *server = NULL;
|
||||
ASSERT_OK(sd_dhcp_server_new(&server, 1));
|
||||
ASSERT_OK(sd_dhcp_server_attach_event(server, event, SD_EVENT_PRIORITY_NORMAL));
|
||||
server->fd = ASSERT_OK_ERRNO(open("/dev/null", O_RDWR|O_CLOEXEC|O_NOCTTY));
|
||||
ASSERT_OK(sd_dhcp_server_set_lease_file(server, dir_fd, "leases"));
|
||||
ASSERT_OK(sd_dhcp_server_configure_pool(server, &address, 24, 0, 0));
|
||||
|
||||
/* add leases to the pool to expose additional code paths */
|
||||
assert_se(add_lease(server, &address, 2) >= 0);
|
||||
assert_se(add_lease(server, &address, 3) >= 0);
|
||||
ASSERT_OK(add_lease(server, &address, 2));
|
||||
ASSERT_OK(add_lease(server, &address, 3));
|
||||
|
||||
/* add static leases */
|
||||
assert_se(add_static_lease(server, 3) >= 0);
|
||||
assert_se(add_static_lease(server, 4) >= 0);
|
||||
ASSERT_OK(add_static_lease(server, 3));
|
||||
ASSERT_OK(add_static_lease(server, 4));
|
||||
|
||||
_cleanup_free_ uint8_t *duped = ASSERT_NOT_NULL(memdup(data, size));
|
||||
(void) dhcp_server_handle_message(server, (DHCPMessage*) duped, size, NULL);
|
||||
|
||||
assert_se(dhcp_server_save_leases(server) >= 0);
|
||||
ASSERT_OK(dhcp_server_save_leases(server));
|
||||
server->bound_leases_by_address = hashmap_free(server->bound_leases_by_address);
|
||||
server->bound_leases_by_client_id = hashmap_free(server->bound_leases_by_client_id);
|
||||
assert_se(dhcp_server_load_leases(server) >= 0);
|
||||
ASSERT_OK(dhcp_server_load_leases(server));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr) {
|
||||
assert_return(lease, -EINVAL);
|
||||
assert_return(addr, -EINVAL);
|
||||
|
||||
if (!lease->have_broadcast)
|
||||
if (lease->broadcast == INADDR_ANY)
|
||||
return -ENODATA;
|
||||
|
||||
addr->s_addr = lease->broadcast;
|
||||
@@ -259,7 +259,7 @@ int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) {
|
||||
assert_return(lease, -EINVAL);
|
||||
assert_return(addr, -EINVAL);
|
||||
|
||||
if (!lease->have_subnet_mask)
|
||||
if (lease->subnet_mask == INADDR_ANY)
|
||||
return -ENODATA;
|
||||
|
||||
addr->s_addr = lease->subnet_mask;
|
||||
@@ -920,16 +920,12 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void
|
||||
r = lease_parse_be32(option, len, &lease->subnet_mask);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to parse subnet mask, ignoring: %m");
|
||||
else
|
||||
lease->have_subnet_mask = true;
|
||||
break;
|
||||
|
||||
case SD_DHCP_OPTION_BROADCAST:
|
||||
r = lease_parse_be32(option, len, &lease->broadcast);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to parse broadcast address, ignoring: %m");
|
||||
else
|
||||
lease->have_broadcast = true;
|
||||
break;
|
||||
|
||||
case SD_DHCP_OPTION_ROUTER:
|
||||
@@ -1579,8 +1575,6 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
||||
r = inet_pton(AF_INET, netmask, &lease->subnet_mask);
|
||||
if (r <= 0)
|
||||
log_debug("Failed to parse netmask %s, ignoring.", netmask);
|
||||
else
|
||||
lease->have_subnet_mask = true;
|
||||
}
|
||||
|
||||
if (server_address) {
|
||||
@@ -1599,8 +1593,6 @@ int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file) {
|
||||
r = inet_pton(AF_INET, broadcast, &lease->broadcast);
|
||||
if (r <= 0)
|
||||
log_debug("Failed to parse broadcast address %s, ignoring.", broadcast);
|
||||
else
|
||||
lease->have_broadcast = true;
|
||||
}
|
||||
|
||||
if (dns) {
|
||||
@@ -1759,7 +1751,7 @@ int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
|
||||
|
||||
assert(lease);
|
||||
|
||||
if (lease->have_subnet_mask)
|
||||
if (lease->subnet_mask != INADDR_ANY)
|
||||
return 0;
|
||||
|
||||
if (lease->address == 0)
|
||||
@@ -1773,7 +1765,6 @@ int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
|
||||
return r;
|
||||
|
||||
lease->subnet_mask = mask.s_addr;
|
||||
lease->have_subnet_mask = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ int sd_dhcp_server_set_static_lease(
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dhcp_server_lease_append_json(sd_dhcp_server_lease *lease, sd_json_variant **ret) {
|
||||
static int dhcp_server_lease_build_json(sd_dhcp_server_lease *lease, sd_json_variant **ret) {
|
||||
assert(lease);
|
||||
assert(ret);
|
||||
|
||||
@@ -271,7 +271,7 @@ int dhcp_server_bound_leases_append_json(sd_dhcp_server *server, sd_json_variant
|
||||
HASHMAP_FOREACH(lease, server->bound_leases_by_client_id) {
|
||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *w = NULL;
|
||||
|
||||
r = dhcp_server_lease_append_json(lease, &w);
|
||||
r = dhcp_server_lease_build_json(lease, &w);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -303,7 +303,7 @@ int dhcp_server_static_leases_append_json(sd_dhcp_server *server, sd_json_varian
|
||||
HASHMAP_FOREACH(lease, server->static_leases_by_client_id) {
|
||||
_cleanup_(sd_json_variant_unrefp) sd_json_variant *w = NULL;
|
||||
|
||||
r = dhcp_server_lease_append_json(lease, &w);
|
||||
r = dhcp_server_lease_build_json(lease, &w);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ int sd_dhcp_server_is_in_relay_mode(sd_dhcp_server *server) {
|
||||
return in4_addr_is_set(&server->relay_target);
|
||||
}
|
||||
|
||||
static sd_dhcp_server *dhcp_server_free(sd_dhcp_server *server) {
|
||||
static sd_dhcp_server* dhcp_server_free(sd_dhcp_server *server) {
|
||||
assert(server);
|
||||
|
||||
sd_dhcp_server_stop(server);
|
||||
@@ -236,7 +236,7 @@ int sd_dhcp_server_detach_event(sd_dhcp_server *server) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
sd_event *sd_dhcp_server_get_event(sd_dhcp_server *server) {
|
||||
sd_event* sd_dhcp_server_get_event(sd_dhcp_server *server) {
|
||||
assert_return(server, NULL);
|
||||
|
||||
return server->event;
|
||||
|
||||
@@ -193,10 +193,31 @@ enum {
|
||||
SD_DHCP_OPTION_END = 255 /* [RFC2132] */
|
||||
};
|
||||
|
||||
/* Suboptions for SD_DHCP_OPTION_RELAY_AGENT_INFORMATION option */
|
||||
/* Suboptions for SD_DHCP_OPTION_RELAY_AGENT_INFORMATION option. See
|
||||
* https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp-parameters.xhtml#relay-agent-sub-options */
|
||||
enum {
|
||||
SD_DHCP_RELAY_AGENT_CIRCUIT_ID = 1,
|
||||
SD_DHCP_RELAY_AGENT_REMOTE_ID = 2
|
||||
SD_DHCP_RELAY_AGENT_CIRCUIT_ID = 1,
|
||||
SD_DHCP_RELAY_AGENT_REMOTE_ID = 2,
|
||||
/* suboption code 3 is reserved */
|
||||
SD_DHCP_RELAY_AGENT_DOCSIS_DEVICE_CLASS = 4,
|
||||
SD_DHCP_RELAY_AGENT_LINK_SELECTION = 5,
|
||||
SD_DHCP_RELAY_AGENT_SUBSCRIBER_ID = 6,
|
||||
SD_DHCP_RELAY_AGENT_RADIUS_ATTRIBUTE = 7,
|
||||
SD_DHCP_RELAY_AGENT_AUTHENTICATION = 8,
|
||||
SD_DHCP_RELAY_AGENT_VENDOR_SPECIFIC_INFORMATION = 9,
|
||||
SD_DHCP_RELAY_AGENT_FLAGS = 10,
|
||||
SD_DHCP_RELAY_AGENT_SERVER_IDENTIFIER_OVERRIDE = 11,
|
||||
SD_DHCP_RELAY_AGENT_IDENTIFIER = 12,
|
||||
SD_DHCP_RELAY_AGENT_ACCESS_TECHNOLOGY_TYPE = 13,
|
||||
SD_DHCP_RELAY_AGENT_ACCESS_NETWORK_NAME = 14,
|
||||
SD_DHCP_RELAY_AGENT_ACCESS_POINT_NAME = 15,
|
||||
SD_DHCP_RELAY_AGENT_ACCESS_POINT_BSSID = 16,
|
||||
SD_DHCP_RELAY_AGENT_OPERATOR_IDENTIFIER = 17,
|
||||
SD_DHCP_RELAY_AGENT_OPERATOR_REALM = 18,
|
||||
SD_DHCP_RELAY_AGENT_SOURCE_PORT = 19,
|
||||
/* suboption code 20-150 are unassigned */
|
||||
SD_DHCP_RELAY_AGENT_VIRTUAL_SUBNET_SELECTION = 151,
|
||||
SD_DHCP_RELAY_AGENT_VIRTUAL_SUBNET_SELECTION_CONTROL = 152
|
||||
};
|
||||
|
||||
_SD_END_DECLARATIONS;
|
||||
|
||||
@@ -41,7 +41,7 @@ _SD_DECLARE_TRIVIAL_REF_UNREF_FUNC(sd_dhcp_server);
|
||||
|
||||
int sd_dhcp_server_attach_event(sd_dhcp_server *server, sd_event *event, int64_t priority);
|
||||
int sd_dhcp_server_detach_event(sd_dhcp_server *server);
|
||||
sd_event *sd_dhcp_server_get_event(sd_dhcp_server *server);
|
||||
sd_event* sd_dhcp_server_get_event(sd_dhcp_server *server);
|
||||
|
||||
typedef void (*sd_dhcp_server_callback_t)(sd_dhcp_server *server, uint64_t event, void *userdata);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user