diff --git a/shared/systemd/nm-sd-utils-shared.c b/shared/systemd/nm-sd-utils-shared.c index 7206fa52b9..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" /*****************************************************************************/ @@ -52,7 +53,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 == '=' @@ -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__ */ 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);