]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-lease: use the last hostname option when multiple hostname is specified 39744/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 15 Nov 2025 21:10:58 +0000 (06:10 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 16 Nov 2025 01:50:34 +0000 (10:50 +0900)
src/libsystemd-network/dhcp-lease-internal.h
src/libsystemd-network/sd-dhcp-lease.c

index 93831d8720fc6c0bba71f611ae50f06bcd21d31a..744580fc48a8823b39e04e72be1731cf09f00a19 100644 (file)
@@ -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;
 
index e811ab7506a7dc16143d491863a380b7409875e0..1d200cb19f0e8f1a631ed8094fbc094e91e706d9 100644 (file)
@@ -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;