From 80500bb5d4eebf682c0f94d0bfeaf8cd44e19626 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 22 Aug 2023 14:32:07 +0900 Subject: [PATCH] network/dhcp: make DUIDType= take an arbitrary integer Closes #26745. --- man/networkd.conf.xml | 2 +- src/libsystemd-network/dhcp-identifier.h | 1 + src/network/networkd-dhcp-common.c | 14 +++++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/man/networkd.conf.xml b/man/networkd.conf.xml index bf597cac2ec..f25083cc69c 100644 --- a/man/networkd.conf.xml +++ b/man/networkd.conf.xml @@ -127,7 +127,7 @@ RFC 3315 for a description of all the options. - The following values are understood: + This takes an integer in the range 0…65535, or one of the following string values: diff --git a/src/libsystemd-network/dhcp-identifier.h b/src/libsystemd-network/dhcp-identifier.h index efb266ef804..7b36f92e7fa 100644 --- a/src/libsystemd-network/dhcp-identifier.h +++ b/src/libsystemd-network/dhcp-identifier.h @@ -19,6 +19,7 @@ typedef enum DUIDType { DUID_TYPE_UUID = 4, _DUID_TYPE_MAX, _DUID_TYPE_INVALID = -EINVAL, + _DUID_TYPE_FORCE_U16 = UINT16_MAX, } DUIDType; /* RFC 3315 section 9.1: diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index 8bd20ea21cb..5b5b251e61e 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -1154,9 +1154,17 @@ int config_parse_duid_type( type = duid_type_from_string(type_string); if (type < 0) { - log_syntax(unit, LOG_WARNING, filename, line, type, - "Failed to parse DUID type '%s', ignoring.", type_string); - return 0; + uint16_t t; + + r = safe_atou16(type_string, &t); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse DUID type '%s', ignoring.", type_string); + return 0; + } + + type = t; + assert(type == t); /* Check if type can store uint16_t. */ } if (!isempty(p)) {