X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-dhcp%2Fsd-dhcp-client.c;h=37fad9a30159f915eb53ae218ff92660d3199865;hb=1aed1cbc10d33e5bf5836e6838ac16add2002152;hp=3b7b9f4ccdcad712eef8ba25cef6dc0751d234ea;hpb=c61be55d23f7603a986dc2937dd7f9aa390ae79c;p=elogind.git diff --git a/src/libsystemd-dhcp/sd-dhcp-client.c b/src/libsystemd-dhcp/sd-dhcp-client.c index 3b7b9f4cc..37fad9a30 100644 --- a/src/libsystemd-dhcp/sd-dhcp-client.c +++ b/src/libsystemd-dhcp/sd-dhcp-client.c @@ -240,21 +240,6 @@ int sd_dhcp_client_get_hostname(sd_dhcp_client *client, const char **hostname) { return 0; } -int sd_dhcp_client_prefixlen(const struct in_addr *addr) { - int len = 0; - uint32_t mask; - - assert_return(addr, -EADDRNOTAVAIL); - - mask = be32toh(addr->s_addr); - while (mask) { - len++; - mask = mask << 1; - } - - return len; -} - int sd_dhcp_client_get_router(sd_dhcp_client *client, struct in_addr *addr) { assert_return(client, -EINVAL); assert_return(addr, -EINVAL); @@ -741,7 +726,7 @@ static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata) return client_initialize_events(client, usec); } -static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option, +static int client_parse_options(uint8_t code, uint8_t len, const uint8_t *option, void *user_data) { DHCPLease *lease = user_data; be32_t val; @@ -775,7 +760,7 @@ static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option, break; case DHCP_OPTION_DOMAIN_NAME_SERVER: - if (len >= 4) { + if (len && !(len % 4)) { unsigned i; lease->dns_size = len / 4; @@ -853,13 +838,18 @@ static int client_verify_headers(sd_dhcp_client *client, DHCPPacket *message, hdrlen)) return -EINVAL; - message->ip.check = message->udp.len; - message->ip.ttl = 0; - - if (hdrlen + be16toh(message->udp.len) > len || - client_checksum(&message->ip.ttl, be16toh(message->udp.len) + 12)) + if (hdrlen + be16toh(message->udp.len) > len) return -EINVAL; + if (message->udp.check) { + message->ip.check = message->udp.len; + message->ip.ttl = 0; + + if (client_checksum(&message->ip.ttl, + be16toh(message->udp.len) + 12)) + return -EINVAL; + } + if (be16toh(message->udp.source) != DHCP_PORT_SERVER || be16toh(message->udp.dest) != DHCP_PORT_CLIENT) return -EINVAL; @@ -891,7 +881,7 @@ static int client_receive_offer(sd_dhcp_client *client, DHCPPacket *offer, return -ENOMEM; len = len - DHCP_IP_UDP_SIZE; - r = dhcp_option_parse(&offer->dhcp, len, client_parse_offer, + r = dhcp_option_parse(&offer->dhcp, len, client_parse_options, lease); if (r != DHCP_OFFER) return -ENOMSG; @@ -934,7 +924,7 @@ static int client_receive_ack(sd_dhcp_client *client, const uint8_t *buf, if (!lease) return -ENOMEM; - r = dhcp_option_parse(dhcp, len, client_parse_offer, lease); + r = dhcp_option_parse(dhcp, len, client_parse_options, lease); if (r == DHCP_NAK) return DHCP_EVENT_NO_LEASE;