mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-26 22:30:26 +01:00
systemd: merge branch 'thom311/dhcp-set-client-id-no-inval'
We use sd_dhcp_client_set_client_id() and sd_dhcp6_client_set_duid()
with the aim to set arbitrary client identifiers and DUIDs. Adjust
systemd DHCP library to not reject certain values.
https://github.com/systemd/systemd/pull/11210
5848a9eb4d
This commit is contained in:
commit
bf604ae2d8
4 changed files with 27 additions and 22 deletions
|
|
@ -20,13 +20,19 @@
|
|||
#define APPLICATION_ID SD_ID128_MAKE(a5,0a,d1,12,bf,60,45,77,a2,fb,74,1a,b1,95,5b,03)
|
||||
#define USEC_2000 ((usec_t) 946684800000000) /* 2000-01-01 00:00:00 UTC */
|
||||
|
||||
int dhcp_validate_duid_len(uint16_t duid_type, size_t duid_len) {
|
||||
int dhcp_validate_duid_len(uint16_t duid_type, size_t duid_len, bool strict) {
|
||||
struct duid d;
|
||||
|
||||
assert_cc(sizeof(d.raw) >= MAX_DUID_LEN);
|
||||
if (duid_len > MAX_DUID_LEN)
|
||||
return -EINVAL;
|
||||
|
||||
if (!strict) {
|
||||
/* Strict validation is not requested. We only ensure that the
|
||||
* DUID is not too long. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (duid_type) {
|
||||
case DUID_TYPE_LLT:
|
||||
if (duid_len <= sizeof(d.llt))
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ struct duid {
|
|||
};
|
||||
} _packed_;
|
||||
|
||||
int dhcp_validate_duid_len(uint16_t duid_type, size_t duid_len);
|
||||
int dhcp_validate_duid_len(uint16_t duid_type, size_t duid_len, bool strict);
|
||||
int dhcp_identifier_set_duid_llt(struct duid *duid, usec_t t, const uint8_t *addr, size_t addr_len, uint16_t arp_type, size_t *len);
|
||||
int dhcp_identifier_set_duid_ll(struct duid *duid, const uint8_t *addr, size_t addr_len, uint16_t arp_type, size_t *len);
|
||||
int dhcp_identifier_set_duid_en(struct duid *duid, size_t *len);
|
||||
|
|
|
|||
|
|
@ -302,27 +302,22 @@ int sd_dhcp_client_set_client_id(
|
|||
assert_return(data_len > 0 && data_len <= MAX_CLIENT_ID_LEN, -EINVAL);
|
||||
G_STATIC_ASSERT_EXPR (_NM_SD_MAX_CLIENT_ID_LEN == MAX_CLIENT_ID_LEN);
|
||||
|
||||
switch (type) {
|
||||
|
||||
case ARPHRD_ETHER:
|
||||
if (data_len != ETH_ALEN)
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case ARPHRD_INFINIBAND:
|
||||
if (data_len != INFINIBAND_ALEN)
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (client->client_id_len == data_len + sizeof(client->client_id.type) &&
|
||||
client->client_id.type == type &&
|
||||
memcmp(&client->client_id.raw.data, data, data_len) == 0)
|
||||
return 0;
|
||||
|
||||
/* For hardware types, log debug message about unexpected data length.
|
||||
*
|
||||
* Note that infiniband's INFINIBAND_ALEN is 20 bytes long, but only
|
||||
* last last 8 bytes of the address are stable and suitable to put into
|
||||
* the client-id. The caller is advised to account for that. */
|
||||
if ((type == ARPHRD_ETHER && data_len != ETH_ALEN) ||
|
||||
(type == ARPHRD_INFINIBAND && data_len != 8))
|
||||
log_dhcp_client(client, "Changing client ID to hardware type %u with "
|
||||
"unexpected address length %zu",
|
||||
type, data_len);
|
||||
|
||||
if (!IN_SET(client->state, DHCP_STATE_INIT, DHCP_STATE_STOPPED)) {
|
||||
log_dhcp_client(client, "Changing client ID on running DHCP "
|
||||
"client, restarting");
|
||||
|
|
@ -363,7 +358,7 @@ static int dhcp_client_set_iaid_duid_internal(
|
|||
assert_return(duid_len == 0 || duid != NULL, -EINVAL);
|
||||
|
||||
if (duid != NULL) {
|
||||
r = dhcp_validate_duid_len(duid_type, duid_len);
|
||||
r = dhcp_validate_duid_len(duid_type, duid_len, true);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -208,9 +208,13 @@ static int dhcp6_client_set_duid_internal(
|
|||
assert_return(IN_SET(client->state, DHCP6_STATE_STOPPED), -EBUSY);
|
||||
|
||||
if (duid != NULL) {
|
||||
r = dhcp_validate_duid_len(duid_type, duid_len);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = dhcp_validate_duid_len(duid_type, duid_len, true);
|
||||
if (r < 0) {
|
||||
r = dhcp_validate_duid_len(duid_type, duid_len, false);
|
||||
if (r < 0)
|
||||
return r;
|
||||
log_dhcp6_client(client, "Setting DUID of type %u with unexpected content", duid_type);
|
||||
}
|
||||
|
||||
client->duid.type = htobe16(duid_type);
|
||||
memcpy(&client->duid.raw.data, duid, duid_len);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue