diff options
Diffstat (limited to 'lib/memcpy_kunit.c')
| -rw-r--r-- | lib/memcpy_kunit.c | 59 | 
1 files changed, 55 insertions, 4 deletions
diff --git a/lib/memcpy_kunit.c b/lib/memcpy_kunit.c index 62f8ffcbbaa3..2b5cc70ac53f 100644 --- a/lib/memcpy_kunit.c +++ b/lib/memcpy_kunit.c @@ -29,9 +29,8 @@ struct some_bytes {  };  #define check(instance, v) do {	\ -	int i;	\  	BUILD_BUG_ON(sizeof(instance.data) != 32);	\ -	for (i = 0; i < sizeof(instance.data); i++) {	\ +	for (size_t i = 0; i < sizeof(instance.data); i++) {	\  		KUNIT_ASSERT_EQ_MSG(test, instance.data[i], v, \  			"line %d: '%s' not initialized to 0x%02x @ %d (saw 0x%02x)\n", \  			__LINE__, #instance, v, i, instance.data[i]);	\ @@ -39,9 +38,8 @@ struct some_bytes {  } while (0)  #define compare(name, one, two) do { \ -	int i; \  	BUILD_BUG_ON(sizeof(one) != sizeof(two)); \ -	for (i = 0; i < sizeof(one); i++) {	\ +	for (size_t i = 0; i < sizeof(one); i++) {	\  		KUNIT_EXPECT_EQ_MSG(test, one.data[i], two.data[i], \  			"line %d: %s.data[%d] (0x%02x) != %s.data[%d] (0x%02x)\n", \  			__LINE__, #one, i, one.data[i], #two, i, two.data[i]); \ @@ -272,10 +270,63 @@ static void memset_test(struct kunit *test)  #undef TEST_OP  } +static void strtomem_test(struct kunit *test) +{ +	static const char input[sizeof(unsigned long)] = "hi"; +	static const char truncate[] = "this is too long"; +	struct { +		unsigned long canary1; +		unsigned char output[sizeof(unsigned long)] __nonstring; +		unsigned long canary2; +	} wrap; + +	memset(&wrap, 0xFF, sizeof(wrap)); +	KUNIT_EXPECT_EQ_MSG(test, wrap.canary1, ULONG_MAX, +			    "bad initial canary value"); +	KUNIT_EXPECT_EQ_MSG(test, wrap.canary2, ULONG_MAX, +			    "bad initial canary value"); + +	/* Check unpadded copy leaves surroundings untouched. */ +	strtomem(wrap.output, input); +	KUNIT_EXPECT_EQ(test, wrap.canary1, ULONG_MAX); +	KUNIT_EXPECT_EQ(test, wrap.output[0], input[0]); +	KUNIT_EXPECT_EQ(test, wrap.output[1], input[1]); +	for (size_t i = 2; i < sizeof(wrap.output); i++) +		KUNIT_EXPECT_EQ(test, wrap.output[i], 0xFF); +	KUNIT_EXPECT_EQ(test, wrap.canary2, ULONG_MAX); + +	/* Check truncated copy leaves surroundings untouched. */ +	memset(&wrap, 0xFF, sizeof(wrap)); +	strtomem(wrap.output, truncate); +	KUNIT_EXPECT_EQ(test, wrap.canary1, ULONG_MAX); +	for (size_t i = 0; i < sizeof(wrap.output); i++) +		KUNIT_EXPECT_EQ(test, wrap.output[i], truncate[i]); +	KUNIT_EXPECT_EQ(test, wrap.canary2, ULONG_MAX); + +	/* Check padded copy leaves only string padded. */ +	memset(&wrap, 0xFF, sizeof(wrap)); +	strtomem_pad(wrap.output, input, 0xAA); +	KUNIT_EXPECT_EQ(test, wrap.canary1, ULONG_MAX); +	KUNIT_EXPECT_EQ(test, wrap.output[0], input[0]); +	KUNIT_EXPECT_EQ(test, wrap.output[1], input[1]); +	for (size_t i = 2; i < sizeof(wrap.output); i++) +		KUNIT_EXPECT_EQ(test, wrap.output[i], 0xAA); +	KUNIT_EXPECT_EQ(test, wrap.canary2, ULONG_MAX); + +	/* Check truncated padded copy has no padding. */ +	memset(&wrap, 0xFF, sizeof(wrap)); +	strtomem(wrap.output, truncate); +	KUNIT_EXPECT_EQ(test, wrap.canary1, ULONG_MAX); +	for (size_t i = 0; i < sizeof(wrap.output); i++) +		KUNIT_EXPECT_EQ(test, wrap.output[i], truncate[i]); +	KUNIT_EXPECT_EQ(test, wrap.canary2, ULONG_MAX); +} +  static struct kunit_case memcpy_test_cases[] = {  	KUNIT_CASE(memset_test),  	KUNIT_CASE(memcpy_test),  	KUNIT_CASE(memmove_test), +	KUNIT_CASE(strtomem_test),  	{}  };  |