dhcp6-client: handle IAID with value zero

config_parse_iaid(), dhcp_identifier_set_iaid() and sd_dhcp6_client_set_iaid() all
allow for the IAID to be zero. Also, RFC 3315 makes no mention that zero
would be invalid.

However, client_ensure_iaid() would take an IAID of zero as a sign that
the values was unset. Fix that by keeping track whether IAID is
initialized.

https://github.com/systemd/systemd/pull/10895
0e408b82b8
This commit is contained in:
Thomas Haller 2018-11-23 13:42:13 +01:00
parent b104b9b828
commit 39a1323181

View file

@ -58,6 +58,7 @@ struct sd_dhcp6_client {
struct sd_dhcp6_lease *lease;
int fd;
bool information_request;
bool has_iaid;
be16_t *req_opts;
size_t req_opts_allocated;
size_t req_opts_len;
@ -274,6 +275,7 @@ int sd_dhcp6_client_set_iaid(sd_dhcp6_client *client, uint32_t iaid) {
client->ia_na.ia_na.id = htobe32(iaid);
client->ia_pd.ia_pd.id = htobe32(iaid);
client->has_iaid = true;
return 0;
}
@ -798,7 +800,7 @@ static int client_ensure_iaid(sd_dhcp6_client *client) {
assert(client);
if (client->ia_na.ia_na.id)
if (client->has_iaid)
return 0;
r = dhcp_identifier_set_iaid(client->ifindex, client->mac_addr, client->mac_addr_len, true, &iaid);
@ -807,6 +809,7 @@ static int client_ensure_iaid(sd_dhcp6_client *client) {
client->ia_na.ia_na.id = iaid;
client->ia_pd.ia_pd.id = iaid;
client->has_iaid = true;
return 0;
}