#include <errno.h>
#include <inttypes.h>
#include <linux/ipv6.h>
+#include <linux/netfilter/nf_tables.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
/* 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 "/\\_.");
}
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <errno.h>
+#include <linux/netfilter/nf_tables.h>
#include <locale.h>
#include <math.h>
#include <sys/socket.h>
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);