From fddc57d60a3610c8b08f089d6f569072a2d5eadf Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 17 Oct 2019 17:59:24 +0200 Subject: [PATCH 1/3] shared: fix function return value (cherry picked from commit 319a39cac60dc21ffc05c7a6b68e06bdf05c53f2) --- shared/systemd/nm-sd-utils-shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/systemd/nm-sd-utils-shared.c b/shared/systemd/nm-sd-utils-shared.c index 7206fa52b9..ee297ceaab 100644 --- a/shared/systemd/nm-sd-utils-shared.c +++ b/shared/systemd/nm-sd-utils-shared.c @@ -52,7 +52,7 @@ nm_sd_utils_path_startswith (const char *path, const char *prefix) /*****************************************************************************/ -gboolean +int nm_sd_utils_unbase64char (char ch, gboolean accept_padding_equal) { if ( ch == '=' From 7a08b29a3d5da7963cf2755da49c4aedbe5746df Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 17 Oct 2019 17:39:56 +0200 Subject: [PATCH 2/3] shared: export systemd dns and hostname validation functions (cherry picked from commit 38f942e0386462f95aa95cb8162393e4a53ada1a) --- shared/systemd/nm-sd-utils-shared.c | 15 +++++++++++++-- shared/systemd/nm-sd-utils-shared.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/shared/systemd/nm-sd-utils-shared.c b/shared/systemd/nm-sd-utils-shared.c index ee297ceaab..805c8403c5 100644 --- a/shared/systemd/nm-sd-utils-shared.c +++ b/shared/systemd/nm-sd-utils-shared.c @@ -22,9 +22,10 @@ #include "nm-sd-adapt-shared.h" -#include "path-util.h" -#include "hexdecoct.h" #include "dns-domain.h" +#include "hexdecoct.h" +#include "hostname-util.h" +#include "path-util.h" /*****************************************************************************/ @@ -96,3 +97,13 @@ int nm_sd_dns_name_to_wire_format (const char *domain, { return dns_name_to_wire_format (domain, buffer, len, canonical); } + +int nm_sd_dns_name_is_valid (const char *s) +{ + return dns_name_is_valid (s); +} + +gboolean nm_sd_hostname_is_valid (const char *s, bool allow_trailing_dot) +{ + return hostname_is_valid (s, allow_trailing_dot); +} diff --git a/shared/systemd/nm-sd-utils-shared.h b/shared/systemd/nm-sd-utils-shared.h index 48a8cf37ac..5465a01aca 100644 --- a/shared/systemd/nm-sd-utils-shared.h +++ b/shared/systemd/nm-sd-utils-shared.h @@ -44,4 +44,7 @@ int nm_sd_dns_name_to_wire_format (const char *domain, size_t len, gboolean canonical); +int nm_sd_dns_name_is_valid (const char *s); +gboolean nm_sd_hostname_is_valid(const char *s, bool allow_trailing_dot); + #endif /* __NM_SD_UTILS_SHARED_H__ */ From 9c7859d05bcb624da92de952d6b79fb5e91ed6ee Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 17 Oct 2019 17:40:29 +0200 Subject: [PATCH 3/3] dhcp: ignore hostname when invalid The hostname used for DHCP can be the one obtained from the hostnamed service and is not guaranteed to be valid, at least with systemd 239. Instead of sending an invalid DHCP option to the server or failing due to later checks in clients, ignore the hostname and log a warning when it is invalid. https://bugzilla.redhat.com/show_bug.cgi?id=1744427 (cherry picked from commit 2da4d54ac3e58b94a915d1fd0c488610b855c6fa) --- src/dhcp/nm-dhcp-manager.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/dhcp/nm-dhcp-manager.c b/src/dhcp/nm-dhcp-manager.c index 304a7b9961..943620c9a2 100644 --- a/src/dhcp/nm-dhcp-manager.c +++ b/src/dhcp/nm-dhcp-manager.c @@ -32,6 +32,7 @@ #include #include "nm-glib-aux/nm-dedup-multi.h" +#include "systemd/nm-sd-utils-shared.h" #include "nm-config.h" #include "NetworkManagerUtils.h" @@ -251,6 +252,17 @@ client_start (NMDhcpManager *self, g_return_val_if_reached (NULL) ; } + if (hostname) { + if ( (hostname_use_fqdn && !nm_sd_dns_name_is_valid (hostname)) + || (!hostname_use_fqdn && !nm_sd_hostname_is_valid (hostname, FALSE))) { + nm_log_warn (LOGD_DHCP , "dhcp%c: %s '%s' is invalid, will be ignored", + nm_utils_addr_family_to_char (addr_family), + hostname_use_fqdn ? "FQDN" : "hostname", + hostname); + hostname = NULL; + } + } + nm_assert (g_bytes_get_size (hwaddr) == g_bytes_get_size (bcast_hwaddr)); priv = NM_DHCP_MANAGER_GET_PRIVATE (self);