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
This commit is contained in:
Thomas Haller 2022-04-20 19:16:47 +02:00
parent da7dbc0304
commit 7fcfc5ccb3
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
5 changed files with 27 additions and 20 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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));
}
/*****************************************************************************/