diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Kconfig.debug | 5 | ||||
| -rw-r--r-- | lib/Makefile | 1 | ||||
| -rw-r--r-- | lib/strcat_kunit.c | 104 | ||||
| -rw-r--r-- | lib/string_kunit.c | 82 | 
4 files changed, 82 insertions, 110 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 7ffb06eabcd1..a384070c74bc 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2758,11 +2758,6 @@ config HW_BREAKPOINT_KUNIT_TEST  	  If unsure, say N. -config STRCAT_KUNIT_TEST -	tristate "Test strcat() family of functions at runtime" if !KUNIT_ALL_TESTS -	depends on KUNIT -	default KUNIT_ALL_TESTS -  config SIPHASH_KUNIT_TEST  	tristate "Perform selftest on siphash functions" if !KUNIT_ALL_TESTS  	depends on KUNIT diff --git a/lib/Makefile b/lib/Makefile index 5f994b963d1a..b040ad5f8022 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -403,7 +403,6 @@ CFLAGS_fortify_kunit.o += $(call cc-disable-warning, stringop-overread)  CFLAGS_fortify_kunit.o += $(call cc-disable-warning, stringop-truncation)  CFLAGS_fortify_kunit.o += $(DISABLE_STRUCTLEAK_PLUGIN)  obj-$(CONFIG_FORTIFY_KUNIT_TEST) += fortify_kunit.o -obj-$(CONFIG_STRCAT_KUNIT_TEST) += strcat_kunit.o  obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o  obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o diff --git a/lib/strcat_kunit.c b/lib/strcat_kunit.c deleted file mode 100644 index ca09f7f0e6a2..000000000000 --- a/lib/strcat_kunit.c +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Kernel module for testing 'strcat' family of functions. - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <kunit/test.h> -#include <linux/string.h> - -static volatile int unconst; - -static void test_strcat(struct kunit *test) -{ -	char dest[8]; - -	/* Destination is terminated. */ -	memset(dest, 0, sizeof(dest)); -	KUNIT_EXPECT_EQ(test, strlen(dest), 0); -	/* Empty copy does nothing. */ -	KUNIT_EXPECT_TRUE(test, strcat(dest, "") == dest); -	KUNIT_EXPECT_STREQ(test, dest, ""); -	/* 4 characters copied in, stops at %NUL. */ -	KUNIT_EXPECT_TRUE(test, strcat(dest, "four\000123") == dest); -	KUNIT_EXPECT_STREQ(test, dest, "four"); -	KUNIT_EXPECT_EQ(test, dest[5], '\0'); -	/* 2 more characters copied in okay. */ -	KUNIT_EXPECT_TRUE(test, strcat(dest, "AB") == dest); -	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); -} - -static void test_strncat(struct kunit *test) -{ -	char dest[8]; - -	/* Destination is terminated. */ -	memset(dest, 0, sizeof(dest)); -	KUNIT_EXPECT_EQ(test, strlen(dest), 0); -	/* Empty copy of size 0 does nothing. */ -	KUNIT_EXPECT_TRUE(test, strncat(dest, "", 0 + unconst) == dest); -	KUNIT_EXPECT_STREQ(test, dest, ""); -	/* Empty copy of size 1 does nothing too. */ -	KUNIT_EXPECT_TRUE(test, strncat(dest, "", 1 + unconst) == dest); -	KUNIT_EXPECT_STREQ(test, dest, ""); -	/* Copy of max 0 characters should do nothing. */ -	KUNIT_EXPECT_TRUE(test, strncat(dest, "asdf", 0 + unconst) == dest); -	KUNIT_EXPECT_STREQ(test, dest, ""); - -	/* 4 characters copied in, even if max is 8. */ -	KUNIT_EXPECT_TRUE(test, strncat(dest, "four\000123", 8 + unconst) == dest); -	KUNIT_EXPECT_STREQ(test, dest, "four"); -	KUNIT_EXPECT_EQ(test, dest[5], '\0'); -	KUNIT_EXPECT_EQ(test, dest[6], '\0'); -	/* 2 characters copied in okay, 2 ignored. */ -	KUNIT_EXPECT_TRUE(test, strncat(dest, "ABCD", 2 + unconst) == dest); -	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); -} - -static void test_strlcat(struct kunit *test) -{ -	char dest[8] = ""; -	int len = sizeof(dest) + unconst; - -	/* Destination is terminated. */ -	KUNIT_EXPECT_EQ(test, strlen(dest), 0); -	/* Empty copy is size 0. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "", len), 0); -	KUNIT_EXPECT_STREQ(test, dest, ""); -	/* Size 1 should keep buffer terminated, report size of source only. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "four", 1 + unconst), 4); -	KUNIT_EXPECT_STREQ(test, dest, ""); - -	/* 4 characters copied in. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "four", len), 4); -	KUNIT_EXPECT_STREQ(test, dest, "four"); -	/* 2 characters copied in okay, gets to 6 total. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "AB", len), 6); -	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); -	/* 2 characters ignored if max size (7) reached. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "CD", 7 + unconst), 8); -	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); -	/* 1 of 2 characters skipped, now at true max size. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "EFG", len), 9); -	KUNIT_EXPECT_STREQ(test, dest, "fourABE"); -	/* Everything else ignored, now at full size. */ -	KUNIT_EXPECT_EQ(test, strlcat(dest, "1234", len), 11); -	KUNIT_EXPECT_STREQ(test, dest, "fourABE"); -} - -static struct kunit_case strcat_test_cases[] = { -	KUNIT_CASE(test_strcat), -	KUNIT_CASE(test_strncat), -	KUNIT_CASE(test_strlcat), -	{} -}; - -static struct kunit_suite strcat_test_suite = { -	.name = "strcat", -	.test_cases = strcat_test_cases, -}; - -kunit_test_suite(strcat_test_suite); - -MODULE_LICENSE("GPL"); diff --git a/lib/string_kunit.c b/lib/string_kunit.c index 4af04643f4c2..48752ed19d56 100644 --- a/lib/string_kunit.c +++ b/lib/string_kunit.c @@ -445,6 +445,85 @@ static void test_strscpy(struct kunit *test)  	KUNIT_EXPECT_EQ(test, strscpy(dest, "This is too long", ARRAY_SIZE(dest)), -E2BIG);  } +static volatile int unconst; + +static void test_strcat(struct kunit *test) +{ +	char dest[8]; + +	/* Destination is terminated. */ +	memset(dest, 0, sizeof(dest)); +	KUNIT_EXPECT_EQ(test, strlen(dest), 0); +	/* Empty copy does nothing. */ +	KUNIT_EXPECT_TRUE(test, strcat(dest, "") == dest); +	KUNIT_EXPECT_STREQ(test, dest, ""); +	/* 4 characters copied in, stops at %NUL. */ +	KUNIT_EXPECT_TRUE(test, strcat(dest, "four\000123") == dest); +	KUNIT_EXPECT_STREQ(test, dest, "four"); +	KUNIT_EXPECT_EQ(test, dest[5], '\0'); +	/* 2 more characters copied in okay. */ +	KUNIT_EXPECT_TRUE(test, strcat(dest, "AB") == dest); +	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); +} + +static void test_strncat(struct kunit *test) +{ +	char dest[8]; + +	/* Destination is terminated. */ +	memset(dest, 0, sizeof(dest)); +	KUNIT_EXPECT_EQ(test, strlen(dest), 0); +	/* Empty copy of size 0 does nothing. */ +	KUNIT_EXPECT_TRUE(test, strncat(dest, "", 0 + unconst) == dest); +	KUNIT_EXPECT_STREQ(test, dest, ""); +	/* Empty copy of size 1 does nothing too. */ +	KUNIT_EXPECT_TRUE(test, strncat(dest, "", 1 + unconst) == dest); +	KUNIT_EXPECT_STREQ(test, dest, ""); +	/* Copy of max 0 characters should do nothing. */ +	KUNIT_EXPECT_TRUE(test, strncat(dest, "asdf", 0 + unconst) == dest); +	KUNIT_EXPECT_STREQ(test, dest, ""); + +	/* 4 characters copied in, even if max is 8. */ +	KUNIT_EXPECT_TRUE(test, strncat(dest, "four\000123", 8 + unconst) == dest); +	KUNIT_EXPECT_STREQ(test, dest, "four"); +	KUNIT_EXPECT_EQ(test, dest[5], '\0'); +	KUNIT_EXPECT_EQ(test, dest[6], '\0'); +	/* 2 characters copied in okay, 2 ignored. */ +	KUNIT_EXPECT_TRUE(test, strncat(dest, "ABCD", 2 + unconst) == dest); +	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); +} + +static void test_strlcat(struct kunit *test) +{ +	char dest[8] = ""; +	int len = sizeof(dest) + unconst; + +	/* Destination is terminated. */ +	KUNIT_EXPECT_EQ(test, strlen(dest), 0); +	/* Empty copy is size 0. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "", len), 0); +	KUNIT_EXPECT_STREQ(test, dest, ""); +	/* Size 1 should keep buffer terminated, report size of source only. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "four", 1 + unconst), 4); +	KUNIT_EXPECT_STREQ(test, dest, ""); + +	/* 4 characters copied in. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "four", len), 4); +	KUNIT_EXPECT_STREQ(test, dest, "four"); +	/* 2 characters copied in okay, gets to 6 total. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "AB", len), 6); +	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); +	/* 2 characters ignored if max size (7) reached. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "CD", 7 + unconst), 8); +	KUNIT_EXPECT_STREQ(test, dest, "fourAB"); +	/* 1 of 2 characters skipped, now at true max size. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "EFG", len), 9); +	KUNIT_EXPECT_STREQ(test, dest, "fourABE"); +	/* Everything else ignored, now at full size. */ +	KUNIT_EXPECT_EQ(test, strlcat(dest, "1234", len), 11); +	KUNIT_EXPECT_STREQ(test, dest, "fourABE"); +} +  static struct kunit_case string_test_cases[] = {  	KUNIT_CASE(test_memset16),  	KUNIT_CASE(test_memset32), @@ -461,6 +540,9 @@ static struct kunit_case string_test_cases[] = {  	KUNIT_CASE(test_strncasecmp),  	KUNIT_CASE(test_strncasecmp_long_strings),  	KUNIT_CASE(test_strscpy), +	KUNIT_CASE(test_strcat), +	KUNIT_CASE(test_strncat), +	KUNIT_CASE(test_strlcat),  	{}  };  | 
