14d944bcdSMike Salvatore // SPDX-License-Identifier: GPL-2.0-only
24d944bcdSMike Salvatore /*
34d944bcdSMike Salvatore  * KUnit tests for AppArmor's policy unpack.
44d944bcdSMike Salvatore  */
54d944bcdSMike Salvatore 
64d944bcdSMike Salvatore #include <kunit/test.h>
7b11e51ddSRae Moar #include <kunit/visibility.h>
84d944bcdSMike Salvatore 
94d944bcdSMike Salvatore #include "include/policy.h"
104d944bcdSMike Salvatore #include "include/policy_unpack.h"
114d944bcdSMike Salvatore 
124d944bcdSMike Salvatore #define TEST_STRING_NAME "TEST_STRING"
134d944bcdSMike Salvatore #define TEST_STRING_DATA "testing"
144d944bcdSMike Salvatore #define TEST_STRING_BUF_OFFSET \
154d944bcdSMike Salvatore 	(3 + strlen(TEST_STRING_NAME) + 1)
164d944bcdSMike Salvatore 
174d944bcdSMike Salvatore #define TEST_U32_NAME "U32_TEST"
184d944bcdSMike Salvatore #define TEST_U32_DATA ((u32)0x01020304)
194d944bcdSMike Salvatore #define TEST_NAMED_U32_BUF_OFFSET \
204d944bcdSMike Salvatore 	(TEST_STRING_BUF_OFFSET + 3 + strlen(TEST_STRING_DATA) + 1)
214d944bcdSMike Salvatore #define TEST_U32_BUF_OFFSET \
224d944bcdSMike Salvatore 	(TEST_NAMED_U32_BUF_OFFSET + 3 + strlen(TEST_U32_NAME) + 1)
234d944bcdSMike Salvatore 
244d944bcdSMike Salvatore #define TEST_U16_OFFSET (TEST_U32_BUF_OFFSET + 3)
254d944bcdSMike Salvatore #define TEST_U16_DATA ((u16)(TEST_U32_DATA >> 16))
264d944bcdSMike Salvatore 
274d944bcdSMike Salvatore #define TEST_U64_NAME "U64_TEST"
284d944bcdSMike Salvatore #define TEST_U64_DATA ((u64)0x0102030405060708)
294d944bcdSMike Salvatore #define TEST_NAMED_U64_BUF_OFFSET (TEST_U32_BUF_OFFSET + sizeof(u32) + 1)
304d944bcdSMike Salvatore #define TEST_U64_BUF_OFFSET \
314d944bcdSMike Salvatore 	(TEST_NAMED_U64_BUF_OFFSET + 3 + strlen(TEST_U64_NAME) + 1)
324d944bcdSMike Salvatore 
334d944bcdSMike Salvatore #define TEST_BLOB_NAME "BLOB_TEST"
344d944bcdSMike Salvatore #define TEST_BLOB_DATA "\xde\xad\x00\xbe\xef"
354d944bcdSMike Salvatore #define TEST_BLOB_DATA_SIZE (ARRAY_SIZE(TEST_BLOB_DATA))
364d944bcdSMike Salvatore #define TEST_NAMED_BLOB_BUF_OFFSET (TEST_U64_BUF_OFFSET + sizeof(u64) + 1)
374d944bcdSMike Salvatore #define TEST_BLOB_BUF_OFFSET \
384d944bcdSMike Salvatore 	(TEST_NAMED_BLOB_BUF_OFFSET + 3 + strlen(TEST_BLOB_NAME) + 1)
394d944bcdSMike Salvatore 
404d944bcdSMike Salvatore #define TEST_ARRAY_NAME "ARRAY_TEST"
414d944bcdSMike Salvatore #define TEST_ARRAY_SIZE 16
424d944bcdSMike Salvatore #define TEST_NAMED_ARRAY_BUF_OFFSET \
434d944bcdSMike Salvatore 	(TEST_BLOB_BUF_OFFSET + 5 + TEST_BLOB_DATA_SIZE)
444d944bcdSMike Salvatore #define TEST_ARRAY_BUF_OFFSET \
454d944bcdSMike Salvatore 	(TEST_NAMED_ARRAY_BUF_OFFSET + 3 + strlen(TEST_ARRAY_NAME) + 1)
464d944bcdSMike Salvatore 
47b11e51ddSRae Moar MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
48b11e51ddSRae Moar 
494d944bcdSMike Salvatore struct policy_unpack_fixture {
504d944bcdSMike Salvatore 	struct aa_ext *e;
514d944bcdSMike Salvatore 	size_t e_size;
524d944bcdSMike Salvatore };
534d944bcdSMike Salvatore 
build_aa_ext_struct(struct policy_unpack_fixture * puf,struct kunit * test,size_t buf_size)54ba77f390SMike Salvatore static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf,
554d944bcdSMike Salvatore 					  struct kunit *test, size_t buf_size)
564d944bcdSMike Salvatore {
574d944bcdSMike Salvatore 	char *buf;
584d944bcdSMike Salvatore 	struct aa_ext *e;
594d944bcdSMike Salvatore 
604d944bcdSMike Salvatore 	buf = kunit_kzalloc(test, buf_size, GFP_USER);
614d944bcdSMike Salvatore 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, buf);
624d944bcdSMike Salvatore 
634d944bcdSMike Salvatore 	e = kunit_kmalloc(test, sizeof(*e), GFP_USER);
644d944bcdSMike Salvatore 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, e);
654d944bcdSMike Salvatore 
664d944bcdSMike Salvatore 	e->start = buf;
674d944bcdSMike Salvatore 	e->end = e->start + buf_size;
684d944bcdSMike Salvatore 	e->pos = e->start;
694d944bcdSMike Salvatore 
704d944bcdSMike Salvatore 	*buf = AA_NAME;
714d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_STRING_NAME) + 1;
72*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_STRING_NAME, e->end - (void *)(buf + 3));
734d944bcdSMike Salvatore 
744d944bcdSMike Salvatore 	buf = e->start + TEST_STRING_BUF_OFFSET;
754d944bcdSMike Salvatore 	*buf = AA_STRING;
764d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_STRING_DATA) + 1;
77*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_STRING_DATA, e->end - (void *)(buf + 3));
784d944bcdSMike Salvatore 	buf = e->start + TEST_NAMED_U32_BUF_OFFSET;
794d944bcdSMike Salvatore 	*buf = AA_NAME;
804d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_U32_NAME) + 1;
81*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_U32_NAME, e->end - (void *)(buf + 3));
824d944bcdSMike Salvatore 	*(buf + 3 + strlen(TEST_U32_NAME) + 1) = AA_U32;
834d944bcdSMike Salvatore 	*((u32 *)(buf + 3 + strlen(TEST_U32_NAME) + 2)) = TEST_U32_DATA;
844d944bcdSMike Salvatore 
854d944bcdSMike Salvatore 	buf = e->start + TEST_NAMED_U64_BUF_OFFSET;
864d944bcdSMike Salvatore 	*buf = AA_NAME;
874d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_U64_NAME) + 1;
88*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_U64_NAME, e->end - (void *)(buf + 3));
894d944bcdSMike Salvatore 	*(buf + 3 + strlen(TEST_U64_NAME) + 1) = AA_U64;
904d944bcdSMike Salvatore 	*((u64 *)(buf + 3 + strlen(TEST_U64_NAME) + 2)) = TEST_U64_DATA;
914d944bcdSMike Salvatore 
924d944bcdSMike Salvatore 	buf = e->start + TEST_NAMED_BLOB_BUF_OFFSET;
934d944bcdSMike Salvatore 	*buf = AA_NAME;
944d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_BLOB_NAME) + 1;
95*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_BLOB_NAME, e->end - (void *)(buf + 3));
964d944bcdSMike Salvatore 	*(buf + 3 + strlen(TEST_BLOB_NAME) + 1) = AA_BLOB;
974d944bcdSMike Salvatore 	*(buf + 3 + strlen(TEST_BLOB_NAME) + 2) = TEST_BLOB_DATA_SIZE;
984d944bcdSMike Salvatore 	memcpy(buf + 3 + strlen(TEST_BLOB_NAME) + 6,
994d944bcdSMike Salvatore 		TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE);
1004d944bcdSMike Salvatore 
1014d944bcdSMike Salvatore 	buf = e->start + TEST_NAMED_ARRAY_BUF_OFFSET;
1024d944bcdSMike Salvatore 	*buf = AA_NAME;
1034d944bcdSMike Salvatore 	*(buf + 1) = strlen(TEST_ARRAY_NAME) + 1;
104*b54aebd4SRae Moar 	strscpy(buf + 3, TEST_ARRAY_NAME, e->end - (void *)(buf + 3));
1054d944bcdSMike Salvatore 	*(buf + 3 + strlen(TEST_ARRAY_NAME) + 1) = AA_ARRAY;
1064d944bcdSMike Salvatore 	*((u16 *)(buf + 3 + strlen(TEST_ARRAY_NAME) + 2)) = TEST_ARRAY_SIZE;
1074d944bcdSMike Salvatore 
1084d944bcdSMike Salvatore 	return e;
1094d944bcdSMike Salvatore }
1104d944bcdSMike Salvatore 
policy_unpack_test_init(struct kunit * test)1114d944bcdSMike Salvatore static int policy_unpack_test_init(struct kunit *test)
1124d944bcdSMike Salvatore {
1134d944bcdSMike Salvatore 	size_t e_size = TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1;
1144d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf;
1154d944bcdSMike Salvatore 
1164d944bcdSMike Salvatore 	puf = kunit_kmalloc(test, sizeof(*puf), GFP_USER);
1174d944bcdSMike Salvatore 	KUNIT_EXPECT_NOT_ERR_OR_NULL(test, puf);
1184d944bcdSMike Salvatore 
1194d944bcdSMike Salvatore 	puf->e_size = e_size;
1204d944bcdSMike Salvatore 	puf->e = build_aa_ext_struct(puf, test, e_size);
1214d944bcdSMike Salvatore 
1224d944bcdSMike Salvatore 	test->priv = puf;
1234d944bcdSMike Salvatore 	return 0;
1244d944bcdSMike Salvatore }
1254d944bcdSMike Salvatore 
policy_unpack_test_inbounds_when_inbounds(struct kunit * test)1264d944bcdSMike Salvatore static void policy_unpack_test_inbounds_when_inbounds(struct kunit *test)
1274d944bcdSMike Salvatore {
1284d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1294d944bcdSMike Salvatore 
130b11e51ddSRae Moar 	KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, 0));
131b11e51ddSRae Moar 	KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size / 2));
132b11e51ddSRae Moar 	KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size));
1334d944bcdSMike Salvatore }
1344d944bcdSMike Salvatore 
policy_unpack_test_inbounds_when_out_of_bounds(struct kunit * test)1354d944bcdSMike Salvatore static void policy_unpack_test_inbounds_when_out_of_bounds(struct kunit *test)
1364d944bcdSMike Salvatore {
1374d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1384d944bcdSMike Salvatore 
139b11e51ddSRae Moar 	KUNIT_EXPECT_FALSE(test, aa_inbounds(puf->e, puf->e_size + 1));
1404d944bcdSMike Salvatore }
1414d944bcdSMike Salvatore 
policy_unpack_test_unpack_array_with_null_name(struct kunit * test)1424d944bcdSMike Salvatore static void policy_unpack_test_unpack_array_with_null_name(struct kunit *test)
1434d944bcdSMike Salvatore {
1444d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1454295c60bSJohn Johansen 	u16 array_size = 0;
1464d944bcdSMike Salvatore 
1474d944bcdSMike Salvatore 	puf->e->pos += TEST_ARRAY_BUF_OFFSET;
1484d944bcdSMike Salvatore 
14993761c93SLinus Torvalds 	KUNIT_EXPECT_TRUE(test, aa_unpack_array(puf->e, NULL, &array_size));
1504d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
1514d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
1524d944bcdSMike Salvatore 		puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1);
1534d944bcdSMike Salvatore }
1544d944bcdSMike Salvatore 
policy_unpack_test_unpack_array_with_name(struct kunit * test)1554d944bcdSMike Salvatore static void policy_unpack_test_unpack_array_with_name(struct kunit *test)
1564d944bcdSMike Salvatore {
1574d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1584d944bcdSMike Salvatore 	const char name[] = TEST_ARRAY_NAME;
1594295c60bSJohn Johansen 	u16 array_size = 0;
1604d944bcdSMike Salvatore 
1614d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
1624d944bcdSMike Salvatore 
16393761c93SLinus Torvalds 	KUNIT_EXPECT_TRUE(test, aa_unpack_array(puf->e, name, &array_size));
1644d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
1654d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
1664d944bcdSMike Salvatore 		puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1);
1674d944bcdSMike Salvatore }
1684d944bcdSMike Salvatore 
policy_unpack_test_unpack_array_out_of_bounds(struct kunit * test)1694d944bcdSMike Salvatore static void policy_unpack_test_unpack_array_out_of_bounds(struct kunit *test)
1704d944bcdSMike Salvatore {
1714d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1724d944bcdSMike Salvatore 	const char name[] = TEST_ARRAY_NAME;
1734d944bcdSMike Salvatore 	u16 array_size;
1744d944bcdSMike Salvatore 
1754d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
1764d944bcdSMike Salvatore 	puf->e->end = puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16);
1774d944bcdSMike Salvatore 
17893761c93SLinus Torvalds 	KUNIT_EXPECT_FALSE(test, aa_unpack_array(puf->e, name, &array_size));
1794d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
1804d944bcdSMike Salvatore 		puf->e->start + TEST_NAMED_ARRAY_BUF_OFFSET);
1814d944bcdSMike Salvatore }
1824d944bcdSMike Salvatore 
policy_unpack_test_unpack_blob_with_null_name(struct kunit * test)1834d944bcdSMike Salvatore static void policy_unpack_test_unpack_blob_with_null_name(struct kunit *test)
1844d944bcdSMike Salvatore {
1854d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
1864d944bcdSMike Salvatore 	char *blob = NULL;
1874d944bcdSMike Salvatore 	size_t size;
1884d944bcdSMike Salvatore 
1894d944bcdSMike Salvatore 	puf->e->pos += TEST_BLOB_BUF_OFFSET;
190b11e51ddSRae Moar 	size = aa_unpack_blob(puf->e, &blob, NULL);
1914d944bcdSMike Salvatore 
1924d944bcdSMike Salvatore 	KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
1934d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test,
1944d944bcdSMike Salvatore 		memcmp(blob, TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE) == 0);
1954d944bcdSMike Salvatore }
1964d944bcdSMike Salvatore 
policy_unpack_test_unpack_blob_with_name(struct kunit * test)1974d944bcdSMike Salvatore static void policy_unpack_test_unpack_blob_with_name(struct kunit *test)
1984d944bcdSMike Salvatore {
1994d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2004d944bcdSMike Salvatore 	char *blob = NULL;
2014d944bcdSMike Salvatore 	size_t size;
2024d944bcdSMike Salvatore 
2034d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_BLOB_BUF_OFFSET;
204b11e51ddSRae Moar 	size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
2054d944bcdSMike Salvatore 
2064d944bcdSMike Salvatore 	KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
2074d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test,
2084d944bcdSMike Salvatore 		memcmp(blob, TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE) == 0);
2094d944bcdSMike Salvatore }
2104d944bcdSMike Salvatore 
policy_unpack_test_unpack_blob_out_of_bounds(struct kunit * test)2114d944bcdSMike Salvatore static void policy_unpack_test_unpack_blob_out_of_bounds(struct kunit *test)
2124d944bcdSMike Salvatore {
2134d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2144d944bcdSMike Salvatore 	char *blob = NULL;
2154d944bcdSMike Salvatore 	void *start;
2164d944bcdSMike Salvatore 	int size;
2174d944bcdSMike Salvatore 
2184d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_BLOB_BUF_OFFSET;
2194d944bcdSMike Salvatore 	start = puf->e->pos;
2204d944bcdSMike Salvatore 	puf->e->end = puf->e->start + TEST_BLOB_BUF_OFFSET
2214d944bcdSMike Salvatore 		+ TEST_BLOB_DATA_SIZE - 1;
2224d944bcdSMike Salvatore 
223b11e51ddSRae Moar 	size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
2244d944bcdSMike Salvatore 
2254d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, 0);
2264d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
2274d944bcdSMike Salvatore }
2284d944bcdSMike Salvatore 
policy_unpack_test_unpack_str_with_null_name(struct kunit * test)2294d944bcdSMike Salvatore static void policy_unpack_test_unpack_str_with_null_name(struct kunit *test)
2304d944bcdSMike Salvatore {
2314d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2324d944bcdSMike Salvatore 	const char *string = NULL;
2334d944bcdSMike Salvatore 	size_t size;
2344d944bcdSMike Salvatore 
2354d944bcdSMike Salvatore 	puf->e->pos += TEST_STRING_BUF_OFFSET;
236b11e51ddSRae Moar 	size = aa_unpack_str(puf->e, &string, NULL);
2374d944bcdSMike Salvatore 
2384d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
2394d944bcdSMike Salvatore 	KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
2404d944bcdSMike Salvatore }
2414d944bcdSMike Salvatore 
policy_unpack_test_unpack_str_with_name(struct kunit * test)2424d944bcdSMike Salvatore static void policy_unpack_test_unpack_str_with_name(struct kunit *test)
2434d944bcdSMike Salvatore {
2444d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2454d944bcdSMike Salvatore 	const char *string = NULL;
2464d944bcdSMike Salvatore 	size_t size;
2474d944bcdSMike Salvatore 
248b11e51ddSRae Moar 	size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
2494d944bcdSMike Salvatore 
2504d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
2514d944bcdSMike Salvatore 	KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
2524d944bcdSMike Salvatore }
2534d944bcdSMike Salvatore 
policy_unpack_test_unpack_str_out_of_bounds(struct kunit * test)2544d944bcdSMike Salvatore static void policy_unpack_test_unpack_str_out_of_bounds(struct kunit *test)
2554d944bcdSMike Salvatore {
2564d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2574d944bcdSMike Salvatore 	const char *string = NULL;
2584d944bcdSMike Salvatore 	void *start = puf->e->pos;
2594d944bcdSMike Salvatore 	int size;
2604d944bcdSMike Salvatore 
2614d944bcdSMike Salvatore 	puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
2624d944bcdSMike Salvatore 		+ strlen(TEST_STRING_DATA) - 1;
2634d944bcdSMike Salvatore 
264b11e51ddSRae Moar 	size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
2654d944bcdSMike Salvatore 
2664d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, 0);
2674d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
2684d944bcdSMike Salvatore }
2694d944bcdSMike Salvatore 
policy_unpack_test_unpack_strdup_with_null_name(struct kunit * test)2704d944bcdSMike Salvatore static void policy_unpack_test_unpack_strdup_with_null_name(struct kunit *test)
2714d944bcdSMike Salvatore {
2724d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2734d944bcdSMike Salvatore 	char *string = NULL;
2744d944bcdSMike Salvatore 	size_t size;
2754d944bcdSMike Salvatore 
2764d944bcdSMike Salvatore 	puf->e->pos += TEST_STRING_BUF_OFFSET;
277b11e51ddSRae Moar 	size = aa_unpack_strdup(puf->e, &string, NULL);
2784d944bcdSMike Salvatore 
2794d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
2804d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test,
2814d944bcdSMike Salvatore 			   ((uintptr_t)puf->e->start <= (uintptr_t)string)
2824d944bcdSMike Salvatore 			   && ((uintptr_t)string <= (uintptr_t)puf->e->end));
2834d944bcdSMike Salvatore 	KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
2844d944bcdSMike Salvatore }
2854d944bcdSMike Salvatore 
policy_unpack_test_unpack_strdup_with_name(struct kunit * test)2864d944bcdSMike Salvatore static void policy_unpack_test_unpack_strdup_with_name(struct kunit *test)
2874d944bcdSMike Salvatore {
2884d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
2894d944bcdSMike Salvatore 	char *string = NULL;
2904d944bcdSMike Salvatore 	size_t size;
2914d944bcdSMike Salvatore 
292b11e51ddSRae Moar 	size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
2934d944bcdSMike Salvatore 
2944d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
2954d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test,
2964d944bcdSMike Salvatore 			   ((uintptr_t)puf->e->start <= (uintptr_t)string)
2974d944bcdSMike Salvatore 			   && ((uintptr_t)string <= (uintptr_t)puf->e->end));
2984d944bcdSMike Salvatore 	KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
2994d944bcdSMike Salvatore }
3004d944bcdSMike Salvatore 
policy_unpack_test_unpack_strdup_out_of_bounds(struct kunit * test)3014d944bcdSMike Salvatore static void policy_unpack_test_unpack_strdup_out_of_bounds(struct kunit *test)
3024d944bcdSMike Salvatore {
3034d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3044d944bcdSMike Salvatore 	void *start = puf->e->pos;
3054d944bcdSMike Salvatore 	char *string = NULL;
3064d944bcdSMike Salvatore 	int size;
3074d944bcdSMike Salvatore 
3084d944bcdSMike Salvatore 	puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
3094d944bcdSMike Salvatore 		+ strlen(TEST_STRING_DATA) - 1;
3104d944bcdSMike Salvatore 
311b11e51ddSRae Moar 	size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
3124d944bcdSMike Salvatore 
3134d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, size, 0);
3145f91bd9fSRicardo Ribalda 	KUNIT_EXPECT_NULL(test, string);
3154d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
3164d944bcdSMike Salvatore }
3174d944bcdSMike Salvatore 
policy_unpack_test_unpack_nameX_with_null_name(struct kunit * test)3184d944bcdSMike Salvatore static void policy_unpack_test_unpack_nameX_with_null_name(struct kunit *test)
3194d944bcdSMike Salvatore {
3204d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3214d944bcdSMike Salvatore 	bool success;
3224d944bcdSMike Salvatore 
3234d944bcdSMike Salvatore 	puf->e->pos += TEST_U32_BUF_OFFSET;
3244d944bcdSMike Salvatore 
325b11e51ddSRae Moar 	success = aa_unpack_nameX(puf->e, AA_U32, NULL);
3264d944bcdSMike Salvatore 
3274d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
3284d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
3294d944bcdSMike Salvatore 			    puf->e->start + TEST_U32_BUF_OFFSET + 1);
3304d944bcdSMike Salvatore }
3314d944bcdSMike Salvatore 
policy_unpack_test_unpack_nameX_with_wrong_code(struct kunit * test)3324d944bcdSMike Salvatore static void policy_unpack_test_unpack_nameX_with_wrong_code(struct kunit *test)
3334d944bcdSMike Salvatore {
3344d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3354d944bcdSMike Salvatore 	bool success;
3364d944bcdSMike Salvatore 
3374d944bcdSMike Salvatore 	puf->e->pos += TEST_U32_BUF_OFFSET;
3384d944bcdSMike Salvatore 
339b11e51ddSRae Moar 	success = aa_unpack_nameX(puf->e, AA_BLOB, NULL);
3404d944bcdSMike Salvatore 
3414d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
3424d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
3434d944bcdSMike Salvatore 			    puf->e->start + TEST_U32_BUF_OFFSET);
3444d944bcdSMike Salvatore }
3454d944bcdSMike Salvatore 
policy_unpack_test_unpack_nameX_with_name(struct kunit * test)3464d944bcdSMike Salvatore static void policy_unpack_test_unpack_nameX_with_name(struct kunit *test)
3474d944bcdSMike Salvatore {
3484d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3494d944bcdSMike Salvatore 	const char name[] = TEST_U32_NAME;
3504d944bcdSMike Salvatore 	bool success;
3514d944bcdSMike Salvatore 
3524d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
3534d944bcdSMike Salvatore 
354b11e51ddSRae Moar 	success = aa_unpack_nameX(puf->e, AA_U32, name);
3554d944bcdSMike Salvatore 
3564d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
3574d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
3584d944bcdSMike Salvatore 			    puf->e->start + TEST_U32_BUF_OFFSET + 1);
3594d944bcdSMike Salvatore }
3604d944bcdSMike Salvatore 
policy_unpack_test_unpack_nameX_with_wrong_name(struct kunit * test)3614d944bcdSMike Salvatore static void policy_unpack_test_unpack_nameX_with_wrong_name(struct kunit *test)
3624d944bcdSMike Salvatore {
3634d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3644d944bcdSMike Salvatore 	static const char name[] = "12345678";
3654d944bcdSMike Salvatore 	bool success;
3664d944bcdSMike Salvatore 
3674d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
3684d944bcdSMike Salvatore 
369b11e51ddSRae Moar 	success = aa_unpack_nameX(puf->e, AA_U32, name);
3704d944bcdSMike Salvatore 
3714d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
3724d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
3734d944bcdSMike Salvatore 			    puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
3744d944bcdSMike Salvatore }
3754d944bcdSMike Salvatore 
policy_unpack_test_unpack_u16_chunk_basic(struct kunit * test)3764d944bcdSMike Salvatore static void policy_unpack_test_unpack_u16_chunk_basic(struct kunit *test)
3774d944bcdSMike Salvatore {
3784d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
3794d944bcdSMike Salvatore 	char *chunk = NULL;
3804d944bcdSMike Salvatore 	size_t size;
3814d944bcdSMike Salvatore 
3824d944bcdSMike Salvatore 	puf->e->pos += TEST_U16_OFFSET;
3834d944bcdSMike Salvatore 	/*
3844d944bcdSMike Salvatore 	 * WARNING: For unit testing purposes, we're pushing puf->e->end past
3854d944bcdSMike Salvatore 	 * the end of the allocated memory. Doing anything other than comparing
3864d944bcdSMike Salvatore 	 * memory addresses is dangerous.
3874d944bcdSMike Salvatore 	 */
3884d944bcdSMike Salvatore 	puf->e->end += TEST_U16_DATA;
3894d944bcdSMike Salvatore 
390b11e51ddSRae Moar 	size = aa_unpack_u16_chunk(puf->e, &chunk);
3914d944bcdSMike Salvatore 
392e2f76ad7SDavid Gow 	KUNIT_EXPECT_PTR_EQ(test, chunk,
3934d944bcdSMike Salvatore 			    puf->e->start + TEST_U16_OFFSET + 2);
394e2f76ad7SDavid Gow 	KUNIT_EXPECT_EQ(test, size, TEST_U16_DATA);
395e2f76ad7SDavid Gow 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, (chunk + TEST_U16_DATA));
3964d944bcdSMike Salvatore }
3974d944bcdSMike Salvatore 
policy_unpack_test_unpack_u16_chunk_out_of_bounds_1(struct kunit * test)3984d944bcdSMike Salvatore static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_1(
3994d944bcdSMike Salvatore 		struct kunit *test)
4004d944bcdSMike Salvatore {
4014d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4024d944bcdSMike Salvatore 	char *chunk = NULL;
4034d944bcdSMike Salvatore 	size_t size;
4044d944bcdSMike Salvatore 
4054d944bcdSMike Salvatore 	puf->e->pos = puf->e->end - 1;
4064d944bcdSMike Salvatore 
407b11e51ddSRae Moar 	size = aa_unpack_u16_chunk(puf->e, &chunk);
4084d944bcdSMike Salvatore 
409e2f76ad7SDavid Gow 	KUNIT_EXPECT_EQ(test, size, 0);
4105f91bd9fSRicardo Ribalda 	KUNIT_EXPECT_NULL(test, chunk);
4114d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->end - 1);
4124d944bcdSMike Salvatore }
4134d944bcdSMike Salvatore 
policy_unpack_test_unpack_u16_chunk_out_of_bounds_2(struct kunit * test)4144d944bcdSMike Salvatore static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_2(
4154d944bcdSMike Salvatore 		struct kunit *test)
4164d944bcdSMike Salvatore {
4174d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4184d944bcdSMike Salvatore 	char *chunk = NULL;
4194d944bcdSMike Salvatore 	size_t size;
4204d944bcdSMike Salvatore 
4214d944bcdSMike Salvatore 	puf->e->pos += TEST_U16_OFFSET;
4224d944bcdSMike Salvatore 	/*
4234d944bcdSMike Salvatore 	 * WARNING: For unit testing purposes, we're pushing puf->e->end past
4244d944bcdSMike Salvatore 	 * the end of the allocated memory. Doing anything other than comparing
4254d944bcdSMike Salvatore 	 * memory addresses is dangerous.
4264d944bcdSMike Salvatore 	 */
4274d944bcdSMike Salvatore 	puf->e->end = puf->e->pos + TEST_U16_DATA - 1;
4284d944bcdSMike Salvatore 
429b11e51ddSRae Moar 	size = aa_unpack_u16_chunk(puf->e, &chunk);
4304d944bcdSMike Salvatore 
431e2f76ad7SDavid Gow 	KUNIT_EXPECT_EQ(test, size, 0);
4325f91bd9fSRicardo Ribalda 	KUNIT_EXPECT_NULL(test, chunk);
4334d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->start + TEST_U16_OFFSET);
4344d944bcdSMike Salvatore }
4354d944bcdSMike Salvatore 
policy_unpack_test_unpack_u32_with_null_name(struct kunit * test)4364d944bcdSMike Salvatore static void policy_unpack_test_unpack_u32_with_null_name(struct kunit *test)
4374d944bcdSMike Salvatore {
4384d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4394d944bcdSMike Salvatore 	bool success;
440ba77f390SMike Salvatore 	u32 data = 0;
4414d944bcdSMike Salvatore 
4424d944bcdSMike Salvatore 	puf->e->pos += TEST_U32_BUF_OFFSET;
4434d944bcdSMike Salvatore 
444b11e51ddSRae Moar 	success = aa_unpack_u32(puf->e, &data, NULL);
4454d944bcdSMike Salvatore 
4464d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
4474d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
4484d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
4494d944bcdSMike Salvatore 			puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
4504d944bcdSMike Salvatore }
4514d944bcdSMike Salvatore 
policy_unpack_test_unpack_u32_with_name(struct kunit * test)4524d944bcdSMike Salvatore static void policy_unpack_test_unpack_u32_with_name(struct kunit *test)
4534d944bcdSMike Salvatore {
4544d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4554d944bcdSMike Salvatore 	const char name[] = TEST_U32_NAME;
4564d944bcdSMike Salvatore 	bool success;
457ba77f390SMike Salvatore 	u32 data = 0;
4584d944bcdSMike Salvatore 
4594d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
4604d944bcdSMike Salvatore 
461b11e51ddSRae Moar 	success = aa_unpack_u32(puf->e, &data, name);
4624d944bcdSMike Salvatore 
4634d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
4644d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
4654d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
4664d944bcdSMike Salvatore 			puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
4674d944bcdSMike Salvatore }
4684d944bcdSMike Salvatore 
policy_unpack_test_unpack_u32_out_of_bounds(struct kunit * test)4694d944bcdSMike Salvatore static void policy_unpack_test_unpack_u32_out_of_bounds(struct kunit *test)
4704d944bcdSMike Salvatore {
4714d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4724d944bcdSMike Salvatore 	const char name[] = TEST_U32_NAME;
4734d944bcdSMike Salvatore 	bool success;
474ba77f390SMike Salvatore 	u32 data = 0;
4754d944bcdSMike Salvatore 
4764d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
4774d944bcdSMike Salvatore 	puf->e->end = puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32);
4784d944bcdSMike Salvatore 
479b11e51ddSRae Moar 	success = aa_unpack_u32(puf->e, &data, name);
4804d944bcdSMike Salvatore 
4814d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
4824d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
4834d944bcdSMike Salvatore 			puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
4844d944bcdSMike Salvatore }
4854d944bcdSMike Salvatore 
policy_unpack_test_unpack_u64_with_null_name(struct kunit * test)4864d944bcdSMike Salvatore static void policy_unpack_test_unpack_u64_with_null_name(struct kunit *test)
4874d944bcdSMike Salvatore {
4884d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
4894d944bcdSMike Salvatore 	bool success;
490ba77f390SMike Salvatore 	u64 data = 0;
4914d944bcdSMike Salvatore 
4924d944bcdSMike Salvatore 	puf->e->pos += TEST_U64_BUF_OFFSET;
4934d944bcdSMike Salvatore 
494b11e51ddSRae Moar 	success = aa_unpack_u64(puf->e, &data, NULL);
4954d944bcdSMike Salvatore 
4964d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
4974d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
4984d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
4994d944bcdSMike Salvatore 			puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
5004d944bcdSMike Salvatore }
5014d944bcdSMike Salvatore 
policy_unpack_test_unpack_u64_with_name(struct kunit * test)5024d944bcdSMike Salvatore static void policy_unpack_test_unpack_u64_with_name(struct kunit *test)
5034d944bcdSMike Salvatore {
5044d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
5054d944bcdSMike Salvatore 	const char name[] = TEST_U64_NAME;
5064d944bcdSMike Salvatore 	bool success;
507ba77f390SMike Salvatore 	u64 data = 0;
5084d944bcdSMike Salvatore 
5094d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
5104d944bcdSMike Salvatore 
511b11e51ddSRae Moar 	success = aa_unpack_u64(puf->e, &data, name);
5124d944bcdSMike Salvatore 
5134d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
5144d944bcdSMike Salvatore 	KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
5154d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
5164d944bcdSMike Salvatore 			puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
5174d944bcdSMike Salvatore }
5184d944bcdSMike Salvatore 
policy_unpack_test_unpack_u64_out_of_bounds(struct kunit * test)5194d944bcdSMike Salvatore static void policy_unpack_test_unpack_u64_out_of_bounds(struct kunit *test)
5204d944bcdSMike Salvatore {
5214d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
5224d944bcdSMike Salvatore 	const char name[] = TEST_U64_NAME;
5234d944bcdSMike Salvatore 	bool success;
524ba77f390SMike Salvatore 	u64 data = 0;
5254d944bcdSMike Salvatore 
5264d944bcdSMike Salvatore 	puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
5274d944bcdSMike Salvatore 	puf->e->end = puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64);
5284d944bcdSMike Salvatore 
529b11e51ddSRae Moar 	success = aa_unpack_u64(puf->e, &data, name);
5304d944bcdSMike Salvatore 
5314d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
5324d944bcdSMike Salvatore 	KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
5334d944bcdSMike Salvatore 			puf->e->start + TEST_NAMED_U64_BUF_OFFSET);
5344d944bcdSMike Salvatore }
5354d944bcdSMike Salvatore 
policy_unpack_test_unpack_X_code_match(struct kunit * test)5364d944bcdSMike Salvatore static void policy_unpack_test_unpack_X_code_match(struct kunit *test)
5374d944bcdSMike Salvatore {
5384d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
539b11e51ddSRae Moar 	bool success = aa_unpack_X(puf->e, AA_NAME);
5404d944bcdSMike Salvatore 
5414d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, success);
5424d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start + 1);
5434d944bcdSMike Salvatore }
5444d944bcdSMike Salvatore 
policy_unpack_test_unpack_X_code_mismatch(struct kunit * test)5454d944bcdSMike Salvatore static void policy_unpack_test_unpack_X_code_mismatch(struct kunit *test)
5464d944bcdSMike Salvatore {
5474d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
548b11e51ddSRae Moar 	bool success = aa_unpack_X(puf->e, AA_STRING);
5494d944bcdSMike Salvatore 
5504d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
5514d944bcdSMike Salvatore 	KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start);
5524d944bcdSMike Salvatore }
5534d944bcdSMike Salvatore 
policy_unpack_test_unpack_X_out_of_bounds(struct kunit * test)5544d944bcdSMike Salvatore static void policy_unpack_test_unpack_X_out_of_bounds(struct kunit *test)
5554d944bcdSMike Salvatore {
5564d944bcdSMike Salvatore 	struct policy_unpack_fixture *puf = test->priv;
5574d944bcdSMike Salvatore 	bool success;
5584d944bcdSMike Salvatore 
5594d944bcdSMike Salvatore 	puf->e->pos = puf->e->end;
560b11e51ddSRae Moar 	success = aa_unpack_X(puf->e, AA_NAME);
5614d944bcdSMike Salvatore 
5624d944bcdSMike Salvatore 	KUNIT_EXPECT_FALSE(test, success);
5634d944bcdSMike Salvatore }
5644d944bcdSMike Salvatore 
5654d944bcdSMike Salvatore static struct kunit_case apparmor_policy_unpack_test_cases[] = {
5664d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_inbounds_when_inbounds),
5674d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_inbounds_when_out_of_bounds),
5684d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_array_with_null_name),
5694d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_array_with_name),
5704d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_array_out_of_bounds),
5714d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_blob_with_null_name),
5724d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_blob_with_name),
5734d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_blob_out_of_bounds),
5744d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_nameX_with_null_name),
5754d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_code),
5764d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_nameX_with_name),
5774d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_name),
5784d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_str_with_null_name),
5794d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_str_with_name),
5804d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_str_out_of_bounds),
5814d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_strdup_with_null_name),
5824d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_strdup_with_name),
5834d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_strdup_out_of_bounds),
5844d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_basic),
5854d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_1),
5864d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_2),
5874d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u32_with_null_name),
5884d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u32_with_name),
5894d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u32_out_of_bounds),
5904d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u64_with_null_name),
5914d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u64_with_name),
5924d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_u64_out_of_bounds),
5934d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_X_code_match),
5944d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_X_code_mismatch),
5954d944bcdSMike Salvatore 	KUNIT_CASE(policy_unpack_test_unpack_X_out_of_bounds),
5964d944bcdSMike Salvatore 	{},
5974d944bcdSMike Salvatore };
5984d944bcdSMike Salvatore 
5994d944bcdSMike Salvatore static struct kunit_suite apparmor_policy_unpack_test_module = {
6004d944bcdSMike Salvatore 	.name = "apparmor_policy_unpack",
6014d944bcdSMike Salvatore 	.init = policy_unpack_test_init,
6024d944bcdSMike Salvatore 	.test_cases = apparmor_policy_unpack_test_cases,
6034d944bcdSMike Salvatore };
6044d944bcdSMike Salvatore 
6054d944bcdSMike Salvatore kunit_test_suite(apparmor_policy_unpack_test_module);
606b11e51ddSRae Moar 
607b11e51ddSRae Moar MODULE_LICENSE("GPL");
608