diff --git a/src/shared/hostname-setup.c b/src/shared/hostname-setup.c index af89f92bdc4..33b6a05ad86 100644 --- a/src/shared/hostname-setup.c +++ b/src/shared/hostname-setup.c @@ -268,9 +268,10 @@ int hostname_substitute_wildcards(char *name) { * Note that this does not directly use the machine ID, because that's not necessarily supposed to be * public information to be broadcast on the network, while the hostname certainly is. */ - for (char *n = name; *n; n++) { - if (*n != '?') - continue; + for (char *n = name; ; n++) { + n = strchr(n, '?'); + if (!n) + return 0; if (left_bits <= 0) { if (sd_id128_is_null(mid)) { @@ -293,8 +294,6 @@ int hostname_substitute_wildcards(char *name) { h >>= 4; left_bits -= 4; } - - return 0; } char* get_default_hostname(void) { diff --git a/src/test/test-hostname-setup.c b/src/test/test-hostname-setup.c index da6e3796995..8243d600e18 100644 --- a/src/test/test-hostname-setup.c +++ b/src/test/test-hostname-setup.c @@ -76,6 +76,32 @@ TEST(read_etc_hostname) { assert(hostname == (char*) 0x1234); /* does not touch argument on error */ } +TEST(hostname_substitute_wildcards) { + int r; + + r = sd_id128_get_machine(NULL); + if (ERRNO_IS_NEG_MACHINE_ID_UNSET(r)) + return (void) log_tests_skipped_errno(r, "skipping wildcard hostname tests, no machine ID defined"); + + _cleanup_free_ char *buf = NULL; + ASSERT_NOT_NULL((buf = strdup(""))); + ASSERT_OK(hostname_substitute_wildcards(buf)); + ASSERT_STREQ(buf, ""); + ASSERT_NULL((buf = mfree(buf))); + + ASSERT_NOT_NULL((buf = strdup("hogehoge"))); + ASSERT_OK(hostname_substitute_wildcards(buf)); + ASSERT_STREQ(buf, "hogehoge"); + ASSERT_NULL((buf = mfree(buf))); + + ASSERT_NOT_NULL((buf = strdup("hoge??hoge??foo?"))); + ASSERT_OK(hostname_substitute_wildcards(buf)); + log_debug("hostname_substitute_wildcards(\"hoge??hoge??foo?\"): → \"%s\"", buf); + ASSERT_EQ(fnmatch("hoge??hoge??foo?", buf, /* flags= */ 0), 0); + ASSERT_TRUE(hostname_is_valid(buf, /* flags= */ 0)); + ASSERT_NULL((buf = mfree(buf))); +} + TEST(hostname_setup) { hostname_setup(false); }