Blame SOURCES/1013-dhcp6-hostname-rh1858344.patch

78ede0
From 40422ede3f44f4018377a81db1056fb3439107b2 Mon Sep 17 00:00:00 2001
78ede0
From: Beniamino Galvani <bgalvani@redhat.com>
78ede0
Date: Wed, 22 Jul 2020 05:03:47 +0200
78ede0
Subject: [PATCH 1/4] systemd: dhcp6: remove assertions in
78ede0
 dhcp6_option_parse_domainname()
78ede0
78ede0
Assertions are for programming errors; here the input comes directly
78ede0
from the DHCP response packet.
78ede0
78ede0
https://github.com/systemd/systemd/commit/af710b535b4ceacd0aecec6748a4f8ee57742e99
78ede0
(cherry picked from commit e2248143af0d4ec61e571c4f358d5d7f1044289c)
78ede0
---
78ede0
 src/systemd/src/libsystemd-network/dhcp6-option.c | 6 ++++--
78ede0
 1 file changed, 4 insertions(+), 2 deletions(-)
78ede0
78ede0
diff --git a/src/systemd/src/libsystemd-network/dhcp6-option.c b/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
index d596752b3b91..717fcdffb815 100644
78ede0
--- a/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
+++ b/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
@@ -649,8 +649,10 @@ int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char *
78ede0
         _cleanup_strv_free_ char **names = NULL;
78ede0
         int r;
78ede0
 
78ede0
-        assert_return(optlen > 1, -ENODATA);
78ede0
-        assert_return(optval[optlen - 1] == '\0', -EINVAL);
78ede0
+        if (optlen <= 1)
78ede0
+                return -ENODATA;
78ede0
+        if (optval[optlen - 1] != '\0')
78ede0
+                return -EINVAL;
78ede0
 
78ede0
         while (pos < optlen) {
78ede0
                 _cleanup_free_ char *ret = NULL;
78ede0
-- 
78ede0
2.26.2
78ede0
78ede0
78ede0
From ab72f05d16d641bccaa1b4870bfb91c03661f1c5 Mon Sep 17 00:00:00 2001
78ede0
From: Beniamino Galvani <bgalvani@redhat.com>
78ede0
Date: Thu, 6 Aug 2020 10:49:07 +0200
78ede0
Subject: [PATCH 2/4] systemd: dhcp6: parse the FQDN option
78ede0
78ede0
Parse option 39 (Client Fully Qualified Domain Name, RFC 4704) from the DHCP
78ede0
reply, which specifies the FQDN assigned by the server to the client.
78ede0
78ede0
https://github.com/systemd/systemd/commit/c43eea9f2effbb066901a61eafef473558d37b0f
78ede0
(cherry picked from commit 813fb7d64ee4cb0f935a3a15b9f5b8f5771655da)
78ede0
---
78ede0
 .../src/libsystemd-network/dhcp6-internal.h   |   5 +-
78ede0
 .../libsystemd-network/dhcp6-lease-internal.h |   2 +
78ede0
 .../src/libsystemd-network/dhcp6-option.c     | 118 ++++++++++++------
78ede0
 .../src/libsystemd-network/sd-dhcp6-client.c  |   7 ++
78ede0
 .../src/libsystemd-network/sd-dhcp6-lease.c   |  39 +++++-
78ede0
 src/systemd/src/systemd/sd-dhcp6-lease.h      |   1 +
78ede0
 6 files changed, 129 insertions(+), 43 deletions(-)
78ede0
78ede0
diff --git a/src/systemd/src/libsystemd-network/dhcp6-internal.h b/src/systemd/src/libsystemd-network/dhcp6-internal.h
78ede0
index b0d1216eed84..068dcade0583 100644
78ede0
--- a/src/systemd/src/libsystemd-network/dhcp6-internal.h
78ede0
+++ b/src/systemd/src/libsystemd-network/dhcp6-internal.h
78ede0
@@ -109,8 +109,9 @@ int dhcp6_option_parse_ia(DHCP6Option *iaoption, DHCP6IA *ia, uint16_t *ret_stat
78ede0
 int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
78ede0
                                 struct in6_addr **addrs, size_t count,
78ede0
                                 size_t *allocated);
78ede0
-int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen,
78ede0
-                                  char ***str_arr);
78ede0
+int dhcp6_option_parse_domainname_list(const uint8_t *optval, uint16_t optlen,
78ede0
+                                       char ***str_arr);
78ede0
+int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char **str);
78ede0
 
78ede0
 int dhcp6_network_bind_udp_socket(int index, struct in6_addr *address);
78ede0
 int dhcp6_network_send_udp_socket(int s, struct in6_addr *address,
78ede0
diff --git a/src/systemd/src/libsystemd-network/dhcp6-lease-internal.h b/src/systemd/src/libsystemd-network/dhcp6-lease-internal.h
78ede0
index e004f48b4e24..df6c95e0b360 100644
78ede0
--- a/src/systemd/src/libsystemd-network/dhcp6-lease-internal.h
78ede0
+++ b/src/systemd/src/libsystemd-network/dhcp6-lease-internal.h
78ede0
@@ -35,6 +35,7 @@ struct sd_dhcp6_lease {
78ede0
         size_t ntp_allocated;
78ede0
         char **ntp_fqdn;
78ede0
         size_t ntp_fqdn_count;
78ede0
+        char *fqdn;
78ede0
 };
78ede0
 
78ede0
 int dhcp6_lease_ia_rebind_expire(const DHCP6IA *ia, uint32_t *expire);
78ede0
@@ -57,5 +58,6 @@ int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
78ede0
 int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen);
78ede0
 int dhcp6_lease_set_sntp(sd_dhcp6_lease *lease, uint8_t *optval,
78ede0
                          size_t optlen) ;
78ede0
+int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval, size_t optlen);
78ede0
 
78ede0
 int dhcp6_lease_new(sd_dhcp6_lease **ret);
78ede0
diff --git a/src/systemd/src/libsystemd-network/dhcp6-option.c b/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
index 717fcdffb815..a6dad9340643 100644
78ede0
--- a/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
+++ b/src/systemd/src/libsystemd-network/dhcp6-option.c
78ede0
@@ -644,61 +644,103 @@ int dhcp6_option_parse_ip6addrs(uint8_t *optval, uint16_t optlen,
78ede0
         return count;
78ede0
 }
78ede0
 
78ede0
-int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char ***str_arr) {
78ede0
-        size_t pos = 0, idx = 0;
78ede0
-        _cleanup_strv_free_ char **names = NULL;
78ede0
+static int parse_domain(const uint8_t **data, uint16_t *len, char **out_domain) {
78ede0
+        _cleanup_free_ char *ret = NULL;
78ede0
+        size_t n = 0, allocated = 0;
78ede0
+        const uint8_t *optval = *data;
78ede0
+        uint16_t optlen = *len;
78ede0
+        bool first = true;
78ede0
         int r;
78ede0
 
78ede0
         if (optlen <= 1)
78ede0
                 return -ENODATA;
78ede0
-        if (optval[optlen - 1] != '\0')
78ede0
-                return -EINVAL;
78ede0
 
78ede0
-        while (pos < optlen) {
78ede0
-                _cleanup_free_ char *ret = NULL;
78ede0
-                size_t n = 0, allocated = 0;
78ede0
-                bool first = true;
78ede0
-
78ede0
-                for (;;) {
78ede0
-                        const char *label;
78ede0
-                        uint8_t c;
78ede0
+        for (;;) {
78ede0
+                const char *label;
78ede0
+                uint8_t c;
78ede0
 
78ede0
-                        c = optval[pos++];
78ede0
+                if (optlen == 0)
78ede0
+                        break;
78ede0
 
78ede0
-                        if (c == 0)
78ede0
-                                /* End of name */
78ede0
-                                break;
78ede0
-                        if (c > 63)
78ede0
-                                return -EBADMSG;
78ede0
+                c = *optval;
78ede0
+                optval++;
78ede0
+                optlen--;
78ede0
 
78ede0
-                        /* Literal label */
78ede0
-                        label = (const char *)&optval[pos];
78ede0
-                        pos += c;
78ede0
-                        if (pos >= optlen)
78ede0
-                                return -EMSGSIZE;
78ede0
+                if (c == 0)
78ede0
+                        /* End label */
78ede0
+                        break;
78ede0
+                if (c > 63)
78ede0
+                        return -EBADMSG;
78ede0
+                if (c > optlen)
78ede0
+                        return -EMSGSIZE;
78ede0
 
78ede0
-                        if (!GREEDY_REALLOC(ret, allocated, n + !first + DNS_LABEL_ESCAPED_MAX))
78ede0
-                                return -ENOMEM;
78ede0
+                /* Literal label */
78ede0
+                label = (const char *)optval;
78ede0
+                optval += c;
78ede0
+                optlen -= c;
78ede0
 
78ede0
-                        if (first)
78ede0
-                                first = false;
78ede0
-                        else
78ede0
-                                ret[n++] = '.';
78ede0
+                if (!GREEDY_REALLOC(ret, allocated, n + !first + DNS_LABEL_ESCAPED_MAX))
78ede0
+                        return -ENOMEM;
78ede0
 
78ede0
-                        r = dns_label_escape(label, c, ret + n, DNS_LABEL_ESCAPED_MAX);
78ede0
-                        if (r < 0)
78ede0
-                                return r;
78ede0
+                if (first)
78ede0
+                        first = false;
78ede0
+                else
78ede0
+                        ret[n++] = '.';
78ede0
 
78ede0
-                        n += r;
78ede0
-                }
78ede0
+                r = dns_label_escape(label, c, ret + n, DNS_LABEL_ESCAPED_MAX);
78ede0
+                if (r < 0)
78ede0
+                        return r;
78ede0
 
78ede0
-                if (n == 0)
78ede0
-                        continue;
78ede0
+                n += r;
78ede0
+        }
78ede0
 
78ede0
+        if (n) {
78ede0
                 if (!GREEDY_REALLOC(ret, allocated, n + 1))
78ede0
                         return -ENOMEM;
78ede0
-
78ede0
                 ret[n] = 0;
78ede0
+        }
78ede0
+
78ede0
+        *out_domain = TAKE_PTR(ret);
78ede0
+        *data = optval;
78ede0
+        *len = optlen;
78ede0
+
78ede0
+        return n;
78ede0
+}
78ede0
+
78ede0
+int dhcp6_option_parse_domainname(const uint8_t *optval, uint16_t optlen, char **str) {
78ede0
+        _cleanup_free_ char *domain = NULL;
78ede0
+        int r;
78ede0
+
78ede0
+        r = parse_domain(&optval, &optlen, &domain);
78ede0
+        if (r < 0)
78ede0
+                return r;
78ede0
+        if (r == 0)
78ede0
+                return -ENODATA;
78ede0
+        if (optlen != 0)
78ede0
+                return -EINVAL;
78ede0
+
78ede0
+        *str = TAKE_PTR(domain);
78ede0
+        return 0;
78ede0
+}
78ede0
+
78ede0
+int dhcp6_option_parse_domainname_list(const uint8_t *optval, uint16_t optlen, char ***str_arr) {
78ede0
+        size_t idx = 0;
78ede0
+        _cleanup_strv_free_ char **names = NULL;
78ede0
+        int r;
78ede0
+
78ede0
+        if (optlen <= 1)
78ede0
+                return -ENODATA;
78ede0
+        if (optval[optlen - 1] != '\0')
78ede0
+                return -EINVAL;
78ede0
+
78ede0
+        while (optlen > 0) {
78ede0
+                _cleanup_free_ char *ret = NULL;
78ede0
+
78ede0
+                r = parse_domain(&optval, &optlen, &ret;;
78ede0
+                if (r < 0)
78ede0
+                        return r;
78ede0
+                if (r == 0)
78ede0
+                        continue;
78ede0
 
78ede0
                 r = strv_extend(&names, ret);
78ede0
                 if (r < 0)
78ede0
diff --git a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
78ede0
index d653b2571c00..b80e4e5406d9 100644
78ede0
--- a/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
78ede0
+++ b/src/systemd/src/libsystemd-network/sd-dhcp6-client.c
78ede0
@@ -1288,6 +1288,13 @@ static int client_parse_message(
78ede0
 
78ede0
                         break;
78ede0
 
78ede0
+                case SD_DHCP6_OPTION_FQDN:
78ede0
+                        r = dhcp6_lease_set_fqdn(lease, optval, optlen);
78ede0
+                        if (r < 0)
78ede0
+                                return r;
78ede0
+
78ede0
+                        break;
78ede0
+
78ede0
                 case SD_DHCP6_OPTION_INFORMATION_REFRESH_TIME:
78ede0
                         if (optlen != 4)
78ede0
                                 return -EINVAL;
78ede0
diff --git a/src/systemd/src/libsystemd-network/sd-dhcp6-lease.c b/src/systemd/src/libsystemd-network/sd-dhcp6-lease.c
78ede0
index b6dc02791504..5f5a7fe616fa 100644
78ede0
--- a/src/systemd/src/libsystemd-network/sd-dhcp6-lease.c
78ede0
+++ b/src/systemd/src/libsystemd-network/sd-dhcp6-lease.c
78ede0
@@ -238,7 +238,7 @@ int dhcp6_lease_set_domains(sd_dhcp6_lease *lease, uint8_t *optval,
78ede0
         if (!optlen)
78ede0
                 return 0;
78ede0
 
78ede0
-        r = dhcp6_option_parse_domainname(optval, optlen, &domains);
78ede0
+        r = dhcp6_option_parse_domainname_list(optval, optlen, &domains);
78ede0
         if (r < 0)
78ede0
                 return 0;
78ede0
 
78ede0
@@ -296,8 +296,8 @@ int dhcp6_lease_set_ntp(sd_dhcp6_lease *lease, uint8_t *optval, size_t optlen) {
78ede0
                         break;
78ede0
 
78ede0
                 case DHCP6_NTP_SUBOPTION_SRV_FQDN:
78ede0
-                        r = dhcp6_option_parse_domainname(subval, sublen,
78ede0
-                                                          &servers);
78ede0
+                        r = dhcp6_option_parse_domainname_list(subval, sublen,
78ede0
+                                                               &servers);
78ede0
                         if (r < 0)
78ede0
                                 return 0;
78ede0
 
78ede0
@@ -367,6 +367,38 @@ int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ntp_fqdn) {
78ede0
         return -ENOENT;
78ede0
 }
78ede0
 
78ede0
+int dhcp6_lease_set_fqdn(sd_dhcp6_lease *lease, const uint8_t *optval,
78ede0
+                         size_t optlen) {
78ede0
+        int r;
78ede0
+        char *fqdn;
78ede0
+
78ede0
+        assert_return(lease, -EINVAL);
78ede0
+        assert_return(optval, -EINVAL);
78ede0
+
78ede0
+        if (optlen < 2)
78ede0
+                return -ENODATA;
78ede0
+
78ede0
+        /* Ignore the flags field, it doesn't carry any useful
78ede0
+           information for clients. */
78ede0
+        r = dhcp6_option_parse_domainname(optval + 1, optlen - 1, &fqdn);
78ede0
+        if (r < 0)
78ede0
+                return r;
78ede0
+
78ede0
+        return free_and_replace(lease->fqdn, fqdn);
78ede0
+}
78ede0
+
78ede0
+int sd_dhcp6_lease_get_fqdn(sd_dhcp6_lease *lease, const char **fqdn) {
78ede0
+        assert_return(lease, -EINVAL);
78ede0
+        assert_return(fqdn, -EINVAL);
78ede0
+
78ede0
+        if (lease->fqdn) {
78ede0
+                *fqdn = lease->fqdn;
78ede0
+                return 0;
78ede0
+        }
78ede0
+
78ede0
+        return -ENOENT;
78ede0
+}
78ede0
+
78ede0
 static sd_dhcp6_lease *dhcp6_lease_free(sd_dhcp6_lease *lease) {
78ede0
         assert(lease);
78ede0
 
78ede0
@@ -375,6 +407,7 @@ static sd_dhcp6_lease *dhcp6_lease_free(sd_dhcp6_lease *lease) {
78ede0
         dhcp6_lease_free_ia(&lease->pd);
78ede0
 
78ede0
         free(lease->dns);
78ede0
+        free(lease->fqdn);
78ede0
 
78ede0
         lease->domains = strv_free(lease->domains);
78ede0
 
78ede0
diff --git a/src/systemd/src/systemd/sd-dhcp6-lease.h b/src/systemd/src/systemd/sd-dhcp6-lease.h
78ede0
index 4301c6db878b..240df74af8c5 100644
78ede0
--- a/src/systemd/src/systemd/sd-dhcp6-lease.h
78ede0
+++ b/src/systemd/src/systemd/sd-dhcp6-lease.h
78ede0
@@ -43,6 +43,7 @@ int sd_dhcp6_lease_get_dns(sd_dhcp6_lease *lease, const struct in6_addr **addrs)
78ede0
 int sd_dhcp6_lease_get_domains(sd_dhcp6_lease *lease, char ***domains);
78ede0
 int sd_dhcp6_lease_get_ntp_addrs(sd_dhcp6_lease *lease, const struct in6_addr **addrs);
78ede0
 int sd_dhcp6_lease_get_ntp_fqdn(sd_dhcp6_lease *lease, char ***ntp_fqdn);
78ede0
+int sd_dhcp6_lease_get_fqdn(sd_dhcp6_lease *lease, const char **fqdn);
78ede0
 
78ede0
 sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease);
78ede0
 sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease);
78ede0
-- 
78ede0
2.26.2
78ede0
78ede0
78ede0
From 98d88e272c9d49876ad2c2b1507a4fda9456531e Mon Sep 17 00:00:00 2001
78ede0
From: Beniamino Galvani <bgalvani@redhat.com>
78ede0
Date: Wed, 22 Jul 2020 13:56:39 +0200
78ede0
Subject: [PATCH 3/4] dhcp: export the DHCPv6 FQDN option
78ede0
78ede0
The dhclient backend already exports all the option passed by
78ede0
dhclient, including the FDQN. Export it also for the systemd backend.
78ede0
78ede0
(cherry picked from commit 1621a6ddb1b3f5c51ad774012150bd56cf65fcea)
78ede0
(cherry picked from commit c6a7618f2be4236997362db43cf44a3fdee2d9c9)
78ede0
---
78ede0
 src/dhcp/nm-dhcp-options.c | 1 +
78ede0
 src/dhcp/nm-dhcp-options.h | 2 ++
78ede0
 src/dhcp/nm-dhcp-systemd.c | 8 ++++++++
78ede0
 3 files changed, 11 insertions(+)
78ede0
78ede0
diff --git a/src/dhcp/nm-dhcp-options.c b/src/dhcp/nm-dhcp-options.c
78ede0
index b10635fc674a..d902c77c8c21 100644
78ede0
--- a/src/dhcp/nm-dhcp-options.c
78ede0
+++ b/src/dhcp/nm-dhcp-options.c
78ede0
@@ -183,6 +183,7 @@ const NMDhcpOption _nm_dhcp_option_dhcp6_options[] = {
78ede0
 	REQ (NM_DHCP_OPTION_DHCP6_DNS_SERVERS,                      "dhcp6_name_servers",  TRUE ),
78ede0
 	REQ (NM_DHCP_OPTION_DHCP6_DOMAIN_LIST,                      "dhcp6_domain_search", TRUE ),
78ede0
 	REQ (NM_DHCP_OPTION_DHCP6_SNTP_SERVERS,                     "dhcp6_sntp_servers",  TRUE ),
78ede0
+	REQ (NM_DHCP_OPTION_DHCP6_FQDN,                             "fqdn_fqdn",           FALSE ),
78ede0
 	REQ (NM_DHCP_OPTION_DHCP6_MUD_URL,                          "dhcp6_mud_url",       FALSE ),
78ede0
 
78ede0
 	/* Internal values */
78ede0
diff --git a/src/dhcp/nm-dhcp-options.h b/src/dhcp/nm-dhcp-options.h
78ede0
index 7c0121702dad..bc3df5acd330 100644
78ede0
--- a/src/dhcp/nm-dhcp-options.h
78ede0
+++ b/src/dhcp/nm-dhcp-options.h
78ede0
@@ -160,7 +160,9 @@ typedef enum {
78ede0
 	NM_DHCP_OPTION_DHCP6_DNS_SERVERS       = 23,
78ede0
 	NM_DHCP_OPTION_DHCP6_DOMAIN_LIST       = 24,
78ede0
 	NM_DHCP_OPTION_DHCP6_SNTP_SERVERS      = 31,
78ede0
+	NM_DHCP_OPTION_DHCP6_FQDN              = 39,
78ede0
 	NM_DHCP_OPTION_DHCP6_MUD_URL           = 112,
78ede0
+
78ede0
 	/* Internal values */
78ede0
 	NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS     = 1026,
78ede0
 	NM_DHCP_OPTION_DHCP6_NM_PREFIXLEN      = 1027,
78ede0
diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c
78ede0
index f65937d8e035..7ee101128b43 100644
78ede0
--- a/src/dhcp/nm-dhcp-systemd.c
78ede0
+++ b/src/dhcp/nm-dhcp-systemd.c
78ede0
@@ -740,6 +740,7 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx,
78ede0
 	uint32_t lft_pref, lft_valid;
78ede0
 	char addr_str[NM_UTILS_INET_ADDRSTRLEN];
78ede0
 	char **domains;
78ede0
+	const char *s;
78ede0
 	nm_auto_free_gstring GString *str = NULL;
78ede0
 	int num, i;
78ede0
 
78ede0
@@ -808,6 +809,13 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx,
78ede0
 		                           str->str);
78ede0
 	}
78ede0
 
78ede0
+	if (sd_dhcp6_lease_get_fqdn (lease, &s) >= 0) {
78ede0
+		nm_dhcp_option_add_option (options,
78ede0
+		                           _nm_dhcp_option_dhcp6_options,
78ede0
+		                           NM_DHCP_OPTION_DHCP6_FQDN,
78ede0
+		                           s);
78ede0
+	}
78ede0
+
78ede0
 	NM_SET_OUT (out_options, g_steal_pointer (&options));
78ede0
 	return g_steal_pointer (&ip6_config);
78ede0
 }
78ede0
-- 
78ede0
2.26.2
78ede0
78ede0
78ede0
From bce988af55e0444a23a4c3881a075ff2387b798a Mon Sep 17 00:00:00 2001
78ede0
From: Beniamino Galvani <bgalvani@redhat.com>
78ede0
Date: Wed, 22 Jul 2020 13:49:42 +0200
78ede0
Subject: [PATCH 4/4] policy: get the DHCPv6 hostname from the FQDN option
78ede0
78ede0
There isn't any 'host-name' option for DHCPv6. Read instead the
78ede0
'fqdn-fqdn' option that carries the FQDN assigned by the server to the
78ede0
client.
78ede0
78ede0
(cherry picked from commit 1f74ea52f5818c6e7d5cacd1dffdb2e1f5ee1913)
78ede0
(cherry picked from commit 4e1da002a920888daf5bb3aa4bd21a2d61e3214b)
78ede0
---
78ede0
 src/nm-policy.c | 2 +-
78ede0
 1 file changed, 1 insertion(+), 1 deletion(-)
78ede0
78ede0
diff --git a/src/nm-policy.c b/src/nm-policy.c
78ede0
index e571034bc345..04cbace6019a 100644
78ede0
--- a/src/nm-policy.c
78ede0
+++ b/src/nm-policy.c
78ede0
@@ -764,7 +764,7 @@ update_system_hostname (NMPolicy *self, const char *msg)
78ede0
 		/* Grab a hostname out of the device's DHCP6 config */
78ede0
 		dhcp_config = nm_device_get_dhcp_config (get_default_device (self, AF_INET6), AF_INET6);
78ede0
 		if (dhcp_config) {
78ede0
-			dhcp_hostname = nm_dhcp_config_get_option (dhcp_config, "host_name");
78ede0
+			dhcp_hostname = nm_dhcp_config_get_option (dhcp_config, "fqdn_fqdn");
78ede0
 			if (dhcp_hostname && dhcp_hostname[0]) {
78ede0
 				p = nm_str_skip_leading_spaces (dhcp_hostname);
78ede0
 				if (p[0]) {
78ede0
-- 
78ede0
2.26.2
78ede0