]>
Commit | Line | Data |
---|---|---|
2bd37c5b JR |
1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
2 | /*** | |
96b2fb93 | 3 | Copyright © 2018 Jonathan Rudenberg |
2bd37c5b JR |
4 | ***/ |
5 | ||
6 | #include "fuzz.h" | |
7 | ||
8 | #include "sd-dhcp-server.c" | |
9 | ||
10 | /* stub out network so that the server doesn't send */ | |
11 | ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { | |
12 | return len; | |
13 | } | |
14 | ||
15 | ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags) { | |
16 | return 0; | |
17 | } | |
18 | ||
19 | int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { | |
20 | _cleanup_(sd_dhcp_server_unrefp) sd_dhcp_server *server = NULL; | |
21 | struct in_addr address = {.s_addr = htobe32(UINT32_C(10) << 24 | UINT32_C(1))}; | |
22 | static const uint8_t chaddr[] = {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}; | |
23 | uint8_t *client_id; | |
24 | DHCPLease *lease; | |
25 | int pool_offset; | |
26 | ||
27 | if (size < sizeof(DHCPMessage)) | |
28 | return 0; | |
29 | ||
30 | assert_se(sd_dhcp_server_new(&server, 1) >= 0); | |
31 | server->fd = open("/dev/null", O_RDWR|O_CLOEXEC|O_NOCTTY); | |
32 | assert_se(server->fd >= 0); | |
33 | assert_se(sd_dhcp_server_configure_pool(server, &address, 24, 0, 0) >= 0); | |
34 | ||
35 | /* add a lease to the pool to expose additional code paths */ | |
36 | client_id = malloc(2); | |
37 | assert_se(client_id); | |
38 | client_id[0] = 2; | |
39 | client_id[1] = 2; | |
40 | lease = new0(DHCPLease, 1); | |
41 | assert_se(lease); | |
42 | lease->client_id.length = 2; | |
43 | lease->client_id.data = client_id; | |
44 | lease->address = htobe32(UINT32_C(10) << 24 | UINT32_C(2)); | |
45 | lease->gateway = htobe32(UINT32_C(10) << 24 | UINT32_C(1)); | |
46 | lease->expiration = UINT64_MAX; | |
47 | memcpy(lease->chaddr, chaddr, 16); | |
48 | pool_offset = get_pool_offset(server, lease->address); | |
49 | server->bound_leases[pool_offset] = lease; | |
50 | assert_se(hashmap_put(server->leases_by_client_id, &lease->client_id, lease) >= 0); | |
51 | ||
db52db4a | 52 | (void) dhcp_server_handle_message(server, (DHCPMessage*)data, size); |
2bd37c5b JR |
53 | |
54 | return 0; | |
55 | } |