diff --git a/src/basic/parse-util.c b/src/basic/parse-util.c index faa5344921..2869a51aaa 100644 --- a/src/basic/parse-util.c +++ b/src/basic/parse-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -777,18 +778,14 @@ int parse_loadavg_fixed_point(const char *s, loadavg_t *ret) { /* Limitations are described in https://www.netfilter.org/projects/nftables/manpage.html and * https://bugzilla.netfilter.org/show_bug.cgi?id=1175 */ bool nft_identifier_valid(const char *id) { - if (!id) + if (isempty(id)) return false; - size_t len = strlen(id); - if (len == 0 || len > 31) + if (strlen(id) >= NFT_NAME_MAXLEN) return false; if (!ascii_isalpha(id[0])) return false; - for (size_t i = 1; i < len; i++) - if (!ascii_isalpha(id[i]) && !ascii_isdigit(id[i]) && !IN_SET(id[i], '/', '\\', '_', '.')) - return false; - return true; + return in_charset(id + 1, ALPHANUMERICAL "/\\_."); } diff --git a/src/test/test-parse-util.c b/src/test/test-parse-util.c index 10297ae053..a2bb8cf3c3 100644 --- a/src/test/test-parse-util.c +++ b/src/test/test-parse-util.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include +#include #include #include #include @@ -896,4 +897,21 @@ TEST(parse_loadavg_fixed_point) { ASSERT_ERROR(parse_loadavg_fixed_point("", &fp), EINVAL); } +TEST(nft_identifier_valid) { + ASSERT_TRUE(nft_identifier_valid("a")); + ASSERT_TRUE(nft_identifier_valid("abc")); + ASSERT_TRUE(nft_identifier_valid("abc")); + ASSERT_TRUE(nft_identifier_valid("a012/_\\.")); + + ASSERT_FALSE(nft_identifier_valid(NULL)); + ASSERT_FALSE(nft_identifier_valid("")); + ASSERT_FALSE(nft_identifier_valid("1234")); + ASSERT_FALSE(nft_identifier_valid("1xyz")); + ASSERT_FALSE(nft_identifier_valid("abc?&*")); + + char s[NFT_NAME_MAXLEN+1]; + *(char*) mempset(s, 'a', NFT_NAME_MAXLEN) = '\0'; + ASSERT_FALSE(nft_identifier_valid(s)); +} + DEFINE_TEST_MAIN(LOG_INFO);