From: Yu Watanabe Date: Sat, 15 Nov 2025 21:10:58 +0000 (+0900) Subject: sd-dhcp-lease: use the last hostname option when multiple hostname is specified X-Git-Tag: v259-rc1~38^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=af70b7521fb5d171c661f91f8f8003ea8d00323d;p=thirdparty%2Fsystemd.git sd-dhcp-lease: use the last hostname option when multiple hostname is specified --- diff --git a/src/libsystemd-network/dhcp-lease-internal.h b/src/libsystemd-network/dhcp-lease-internal.h index 93831d8720f..744580fc48a 100644 --- a/src/libsystemd-network/dhcp-lease-internal.h +++ b/src/libsystemd-network/dhcp-lease-internal.h @@ -66,7 +66,8 @@ struct sd_dhcp_lease { char *domainname; char **search_domains; - char *hostname; + char *hostname; /* SD_DHCP_OPTION_HOST_NAME (12) */ + char *fqdn; /* SD_DHCP_OPTION_FQDN (81) */ char *root_path; char *captive_portal; diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index e811ab7506a..1d200cb19f0 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -199,10 +199,15 @@ int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname) { assert_return(lease, -EINVAL); assert_return(hostname, -EINVAL); - if (!lease->hostname) + /* FQDN option (81) always takes precedence. */ + + if (lease->fqdn) + *hostname = lease->fqdn; + else if (lease->hostname) + *hostname = lease->hostname; + else return -ENODATA; - *hostname = lease->hostname; return 0; } @@ -422,6 +427,7 @@ static sd_dhcp_lease *dhcp_lease_free(sd_dhcp_lease *lease) { free(lease->router); free(lease->timezone); free(lease->hostname); + free(lease->fqdn); free(lease->domainname); free(lease->captive_portal); @@ -1013,12 +1019,6 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void break; case SD_DHCP_OPTION_HOST_NAME: - /* FQDN option (81) always takes precedence. If it was already set, do not overwrite it. */ - if (lease->hostname) { - log_debug("Hostname already set via FQDN, ignoring hostname option."); - break; - } - r = lease_parse_domain(option, len, &lease->hostname); if (r < 0) { log_debug_errno(r, "Failed to parse hostname, ignoring: %m"); @@ -1028,7 +1028,7 @@ int dhcp_lease_parse_options(uint8_t code, uint8_t len, const void *option, void break; case SD_DHCP_OPTION_FQDN: - r = lease_parse_fqdn(option, len, &lease->hostname); + r = lease_parse_fqdn(option, len, &lease->fqdn); if (r < 0) { log_debug_errno(r, "Failed to parse FQDN, ignoring: %m"); return 0;