From 7fcfc5ccb34cfa6aefaaefe9ebf4c1fb5718852e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 20 Apr 2022 19:16:47 +0200 Subject: [PATCH] all: hardcode HOST_NAME_MAX to 64 On glibc, HOST_NAME_MAX is defined as 64. Also, Linux' sethostname() enforces that limit (__NEW_UTS_LEN). Also, `man gethostname` comments that HOST_NAME_MAX on Linux is 64. However, when building against musl, HOST_NAME_MAX is defined as 255. That seems wrong. We use this limit to validate the hostname, and that should not depend on the libc or on the compilation. Hardcode the value to 64. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1197 --- src/core/nm-core-utils.c | 4 +-- src/core/tests/test-utils.c | 4 ++- src/libnm-glib-aux/nm-shared-utils.c | 4 +-- src/libnm-glib-aux/nm-shared-utils.h | 6 ++++ .../tests/test-shared-general.c | 29 +++++++++---------- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/core/nm-core-utils.c b/src/core/nm-core-utils.c index 085c806c12..25d1ec807f 100644 --- a/src/core/nm-core-utils.c +++ b/src/core/nm-core-utils.c @@ -5222,7 +5222,7 @@ again: * @shortened: (out) (transfer full): on return, the shortened hostname * * Checks whether the input hostname is valid. If not, tries to shorten it - * to HOST_NAME_MAX or to the first dot, whatever comes earlier. + * to HOST_NAME_MAX (64) or to the first dot, whatever comes earlier. * The new hostname is returned in @shortened. * * Returns: %TRUE if the input hostname was already valid or if was shortened @@ -5248,7 +5248,7 @@ nm_utils_shorten_hostname(const char *hostname, char **shortened) l = (dot - hostname); else l = strlen(hostname); - l = MIN(l, (gsize) HOST_NAME_MAX); + l = MIN(l, (gsize) NM_HOST_NAME_MAX); s = g_strndup(hostname, l); diff --git a/src/core/tests/test-utils.c b/src/core/tests/test-utils.c index ad9950ddb4..2bcb6f6946 100644 --- a/src/core/tests/test-utils.c +++ b/src/core/tests/test-utils.c @@ -234,8 +234,10 @@ test_shorten_hostname(void) * system configuration (`getconf HOST_NAME_MAX`). On Linux * it's typically 64 characters, but POSIX allows up to * 255 characters. + * + * We use our own define NM_HOST_NAME_MAX, which is always 64. */ - maxhost = g_strnfill(HOST_NAME_MAX, 'a'); + maxhost = g_strnfill(NM_HOST_NAME_MAX, 'a'); do_test_shorten_hostname("name1", TRUE, NULL); diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 0756bad45b..f305a7aa13 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -6585,7 +6585,7 @@ nm_utils_validate_hostname(const char *hostname) if (dot) return FALSE; - return (p - hostname <= HOST_NAME_MAX); + return (p - hostname <= NM_HOST_NAME_MAX); } /*****************************************************************************/ @@ -7246,7 +7246,7 @@ nm_hostname_is_valid(const char *s, gboolean trailing_dot) /* Note that HOST_NAME_MAX is 64 on Linux, but DNS allows domain names up to * 255 characters */ - if (p - s > HOST_NAME_MAX) + if (p - s > NM_HOST_NAME_MAX) return FALSE; return TRUE; diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 14b6302662..ec57190e50 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -3256,6 +3256,12 @@ char *_nm_utils_format_variant_attributes(GHashTable *a /*****************************************************************************/ +/* glibc defines HOST_NAME_MAX as 64. Also Linux' sethostname() enforces + * that (__NEW_UTS_LEN). However, musl sets this to 255. + * + * At some places, we want to follow Linux. Hardcode our own define. */ +#define NM_HOST_NAME_MAX 64 + gboolean nm_utils_is_localhost(const char *name); gboolean nm_utils_is_specific_hostname(const char *name); diff --git a/src/libnm-glib-aux/tests/test-shared-general.c b/src/libnm-glib-aux/tests/test-shared-general.c index 15e709b62c..ccd1b1c37b 100644 --- a/src/libnm-glib-aux/tests/test-shared-general.c +++ b/src/libnm-glib-aux/tests/test-shared-general.c @@ -2120,6 +2120,8 @@ test_hostname_is_valid(void) g_assert(!nm_hostname_is_valid("foo..bar", FALSE)); g_assert(!nm_hostname_is_valid("foo.bar..", FALSE)); + G_STATIC_ASSERT_EXPR(NM_HOST_NAME_MAX <= HOST_NAME_MAX); + #define _assert_hostname_length(n, valid) \ G_STMT_START \ { \ @@ -2132,16 +2134,15 @@ test_hostname_is_valid(void) } \ G_STMT_END - _assert_hostname_length(HOST_NAME_MAX - 10, TRUE); - _assert_hostname_length(HOST_NAME_MAX - 1, TRUE); - _assert_hostname_length(HOST_NAME_MAX, TRUE); - _assert_hostname_length(HOST_NAME_MAX + 1, FALSE); - _assert_hostname_length(HOST_NAME_MAX + 10, FALSE); + _assert_hostname_length(NM_HOST_NAME_MAX - 10, TRUE); + _assert_hostname_length(NM_HOST_NAME_MAX - 1, TRUE); + _assert_hostname_length(NM_HOST_NAME_MAX, TRUE); + _assert_hostname_length(NM_HOST_NAME_MAX + 1, FALSE); + _assert_hostname_length(NM_HOST_NAME_MAX + 10, FALSE); - g_assert(nm_hostname_is_valid( - "au-xph5-rvgrdsb5hcxc-47et3a5vvkrc-server-wyoz4elpdpe3.openstack.local", - FALSE) - == (HOST_NAME_MAX >= 69)); + g_assert(!nm_hostname_is_valid( + "au-xph5-rvgrdsb5hcxc-47et3a5vvkrc-server-wyoz4elpdpe3.openstack.local", + FALSE)); g_assert(nm_hostname_is_valid("foobar", TRUE)); g_assert(nm_hostname_is_valid("foobar.com", TRUE)); @@ -2160,13 +2161,11 @@ test_hostname_is_valid(void) g_assert(!nm_hostname_is_valid("foo.bar..", TRUE)); g_assert( nm_hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - TRUE) - == (HOST_NAME_MAX >= 64)); + TRUE)); g_assert( - nm_hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - TRUE) - == (HOST_NAME_MAX >= 104)); + !nm_hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + TRUE)); } /*****************************************************************************/