policy_unpack_test.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * KUnit tests for AppArmor's policy unpack.
  4. */
  5. #include <kunit/test.h>
  6. #include <kunit/visibility.h>
  7. #include "include/policy.h"
  8. #include "include/policy_unpack.h"
  9. #include <linux/unaligned.h>
  10. #define TEST_STRING_NAME "TEST_STRING"
  11. #define TEST_STRING_DATA "testing"
  12. #define TEST_STRING_BUF_OFFSET \
  13. (3 + strlen(TEST_STRING_NAME) + 1)
  14. #define TEST_U32_NAME "U32_TEST"
  15. #define TEST_U32_DATA ((u32)0x01020304)
  16. #define TEST_NAMED_U32_BUF_OFFSET \
  17. (TEST_STRING_BUF_OFFSET + 3 + strlen(TEST_STRING_DATA) + 1)
  18. #define TEST_U32_BUF_OFFSET \
  19. (TEST_NAMED_U32_BUF_OFFSET + 3 + strlen(TEST_U32_NAME) + 1)
  20. #define TEST_U16_OFFSET (TEST_U32_BUF_OFFSET + 3)
  21. #define TEST_U16_DATA ((u16)(TEST_U32_DATA >> 16))
  22. #define TEST_U64_NAME "U64_TEST"
  23. #define TEST_U64_DATA ((u64)0x0102030405060708)
  24. #define TEST_NAMED_U64_BUF_OFFSET (TEST_U32_BUF_OFFSET + sizeof(u32) + 1)
  25. #define TEST_U64_BUF_OFFSET \
  26. (TEST_NAMED_U64_BUF_OFFSET + 3 + strlen(TEST_U64_NAME) + 1)
  27. #define TEST_BLOB_NAME "BLOB_TEST"
  28. #define TEST_BLOB_DATA "\xde\xad\x00\xbe\xef"
  29. #define TEST_BLOB_DATA_SIZE (ARRAY_SIZE(TEST_BLOB_DATA))
  30. #define TEST_NAMED_BLOB_BUF_OFFSET (TEST_U64_BUF_OFFSET + sizeof(u64) + 1)
  31. #define TEST_BLOB_BUF_OFFSET \
  32. (TEST_NAMED_BLOB_BUF_OFFSET + 3 + strlen(TEST_BLOB_NAME) + 1)
  33. #define TEST_ARRAY_NAME "ARRAY_TEST"
  34. #define TEST_ARRAY_SIZE 16
  35. #define TEST_NAMED_ARRAY_BUF_OFFSET \
  36. (TEST_BLOB_BUF_OFFSET + 5 + TEST_BLOB_DATA_SIZE)
  37. #define TEST_ARRAY_BUF_OFFSET \
  38. (TEST_NAMED_ARRAY_BUF_OFFSET + 3 + strlen(TEST_ARRAY_NAME) + 1)
  39. MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
  40. struct policy_unpack_fixture {
  41. struct aa_ext *e;
  42. size_t e_size;
  43. };
  44. static struct aa_ext *build_aa_ext_struct(struct policy_unpack_fixture *puf,
  45. struct kunit *test, size_t buf_size)
  46. {
  47. char *buf;
  48. struct aa_ext *e;
  49. buf = kunit_kzalloc(test, buf_size, GFP_USER);
  50. KUNIT_EXPECT_NOT_ERR_OR_NULL(test, buf);
  51. e = kunit_kmalloc(test, sizeof(*e), GFP_USER);
  52. KUNIT_EXPECT_NOT_ERR_OR_NULL(test, e);
  53. e->start = buf;
  54. e->end = e->start + buf_size;
  55. e->pos = e->start;
  56. *buf = AA_NAME;
  57. *(buf + 1) = strlen(TEST_STRING_NAME) + 1;
  58. strscpy(buf + 3, TEST_STRING_NAME, e->end - (void *)(buf + 3));
  59. buf = e->start + TEST_STRING_BUF_OFFSET;
  60. *buf = AA_STRING;
  61. *(buf + 1) = strlen(TEST_STRING_DATA) + 1;
  62. strscpy(buf + 3, TEST_STRING_DATA, e->end - (void *)(buf + 3));
  63. buf = e->start + TEST_NAMED_U32_BUF_OFFSET;
  64. *buf = AA_NAME;
  65. *(buf + 1) = strlen(TEST_U32_NAME) + 1;
  66. strscpy(buf + 3, TEST_U32_NAME, e->end - (void *)(buf + 3));
  67. *(buf + 3 + strlen(TEST_U32_NAME) + 1) = AA_U32;
  68. put_unaligned_le32(TEST_U32_DATA, buf + 3 + strlen(TEST_U32_NAME) + 2);
  69. buf = e->start + TEST_NAMED_U64_BUF_OFFSET;
  70. *buf = AA_NAME;
  71. *(buf + 1) = strlen(TEST_U64_NAME) + 1;
  72. strscpy(buf + 3, TEST_U64_NAME, e->end - (void *)(buf + 3));
  73. *(buf + 3 + strlen(TEST_U64_NAME) + 1) = AA_U64;
  74. *((__le64 *)(buf + 3 + strlen(TEST_U64_NAME) + 2)) = cpu_to_le64(TEST_U64_DATA);
  75. buf = e->start + TEST_NAMED_BLOB_BUF_OFFSET;
  76. *buf = AA_NAME;
  77. *(buf + 1) = strlen(TEST_BLOB_NAME) + 1;
  78. strscpy(buf + 3, TEST_BLOB_NAME, e->end - (void *)(buf + 3));
  79. *(buf + 3 + strlen(TEST_BLOB_NAME) + 1) = AA_BLOB;
  80. *(buf + 3 + strlen(TEST_BLOB_NAME) + 2) = TEST_BLOB_DATA_SIZE;
  81. memcpy(buf + 3 + strlen(TEST_BLOB_NAME) + 6,
  82. TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE);
  83. buf = e->start + TEST_NAMED_ARRAY_BUF_OFFSET;
  84. *buf = AA_NAME;
  85. *(buf + 1) = strlen(TEST_ARRAY_NAME) + 1;
  86. strscpy(buf + 3, TEST_ARRAY_NAME, e->end - (void *)(buf + 3));
  87. *(buf + 3 + strlen(TEST_ARRAY_NAME) + 1) = AA_ARRAY;
  88. put_unaligned_le16(TEST_ARRAY_SIZE, buf + 3 + strlen(TEST_ARRAY_NAME) + 2);
  89. return e;
  90. }
  91. static int policy_unpack_test_init(struct kunit *test)
  92. {
  93. size_t e_size = TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1;
  94. struct policy_unpack_fixture *puf;
  95. puf = kunit_kmalloc(test, sizeof(*puf), GFP_USER);
  96. KUNIT_EXPECT_NOT_ERR_OR_NULL(test, puf);
  97. puf->e_size = e_size;
  98. puf->e = build_aa_ext_struct(puf, test, e_size);
  99. test->priv = puf;
  100. return 0;
  101. }
  102. static void policy_unpack_test_inbounds_when_inbounds(struct kunit *test)
  103. {
  104. struct policy_unpack_fixture *puf = test->priv;
  105. KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, 0));
  106. KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size / 2));
  107. KUNIT_EXPECT_TRUE(test, aa_inbounds(puf->e, puf->e_size));
  108. }
  109. static void policy_unpack_test_inbounds_when_out_of_bounds(struct kunit *test)
  110. {
  111. struct policy_unpack_fixture *puf = test->priv;
  112. KUNIT_EXPECT_FALSE(test, aa_inbounds(puf->e, puf->e_size + 1));
  113. }
  114. static void policy_unpack_test_unpack_array_with_null_name(struct kunit *test)
  115. {
  116. struct policy_unpack_fixture *puf = test->priv;
  117. u16 array_size = 0;
  118. puf->e->pos += TEST_ARRAY_BUF_OFFSET;
  119. KUNIT_EXPECT_TRUE(test, aa_unpack_array(puf->e, NULL, &array_size));
  120. KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
  121. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  122. puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1);
  123. }
  124. static void policy_unpack_test_unpack_array_with_name(struct kunit *test)
  125. {
  126. struct policy_unpack_fixture *puf = test->priv;
  127. const char name[] = TEST_ARRAY_NAME;
  128. u16 array_size = 0;
  129. puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
  130. KUNIT_EXPECT_TRUE(test, aa_unpack_array(puf->e, name, &array_size));
  131. KUNIT_EXPECT_EQ(test, array_size, (u16)TEST_ARRAY_SIZE);
  132. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  133. puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16) + 1);
  134. }
  135. static void policy_unpack_test_unpack_array_out_of_bounds(struct kunit *test)
  136. {
  137. struct policy_unpack_fixture *puf = test->priv;
  138. const char name[] = TEST_ARRAY_NAME;
  139. u16 array_size;
  140. puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
  141. puf->e->end = puf->e->start + TEST_ARRAY_BUF_OFFSET + sizeof(u16);
  142. KUNIT_EXPECT_FALSE(test, aa_unpack_array(puf->e, name, &array_size));
  143. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  144. puf->e->start + TEST_NAMED_ARRAY_BUF_OFFSET);
  145. }
  146. static void policy_unpack_test_unpack_blob_with_null_name(struct kunit *test)
  147. {
  148. struct policy_unpack_fixture *puf = test->priv;
  149. char *blob = NULL;
  150. size_t size;
  151. puf->e->pos += TEST_BLOB_BUF_OFFSET;
  152. size = aa_unpack_blob(puf->e, &blob, NULL);
  153. KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
  154. KUNIT_EXPECT_TRUE(test,
  155. memcmp(blob, TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE) == 0);
  156. }
  157. static void policy_unpack_test_unpack_blob_with_name(struct kunit *test)
  158. {
  159. struct policy_unpack_fixture *puf = test->priv;
  160. char *blob = NULL;
  161. size_t size;
  162. puf->e->pos += TEST_NAMED_BLOB_BUF_OFFSET;
  163. size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
  164. KUNIT_ASSERT_EQ(test, size, TEST_BLOB_DATA_SIZE);
  165. KUNIT_EXPECT_TRUE(test,
  166. memcmp(blob, TEST_BLOB_DATA, TEST_BLOB_DATA_SIZE) == 0);
  167. }
  168. static void policy_unpack_test_unpack_blob_out_of_bounds(struct kunit *test)
  169. {
  170. struct policy_unpack_fixture *puf = test->priv;
  171. char *blob = NULL;
  172. void *start;
  173. int size;
  174. puf->e->pos += TEST_NAMED_BLOB_BUF_OFFSET;
  175. start = puf->e->pos;
  176. puf->e->end = puf->e->start + TEST_BLOB_BUF_OFFSET
  177. + TEST_BLOB_DATA_SIZE - 1;
  178. size = aa_unpack_blob(puf->e, &blob, TEST_BLOB_NAME);
  179. KUNIT_EXPECT_EQ(test, size, 0);
  180. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
  181. }
  182. static void policy_unpack_test_unpack_str_with_null_name(struct kunit *test)
  183. {
  184. struct policy_unpack_fixture *puf = test->priv;
  185. const char *string = NULL;
  186. size_t size;
  187. puf->e->pos += TEST_STRING_BUF_OFFSET;
  188. size = aa_unpack_str(puf->e, &string, NULL);
  189. KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
  190. KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
  191. }
  192. static void policy_unpack_test_unpack_str_with_name(struct kunit *test)
  193. {
  194. struct policy_unpack_fixture *puf = test->priv;
  195. const char *string = NULL;
  196. size_t size;
  197. size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
  198. KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
  199. KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
  200. }
  201. static void policy_unpack_test_unpack_str_out_of_bounds(struct kunit *test)
  202. {
  203. struct policy_unpack_fixture *puf = test->priv;
  204. const char *string = NULL;
  205. void *start = puf->e->pos;
  206. int size;
  207. puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
  208. + strlen(TEST_STRING_DATA) - 1;
  209. size = aa_unpack_str(puf->e, &string, TEST_STRING_NAME);
  210. KUNIT_EXPECT_EQ(test, size, 0);
  211. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
  212. }
  213. static void policy_unpack_test_unpack_strdup_with_null_name(struct kunit *test)
  214. {
  215. struct policy_unpack_fixture *puf = test->priv;
  216. char *string = NULL;
  217. size_t size;
  218. puf->e->pos += TEST_STRING_BUF_OFFSET;
  219. size = aa_unpack_strdup(puf->e, &string, NULL);
  220. KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
  221. KUNIT_EXPECT_FALSE(test,
  222. ((uintptr_t)puf->e->start <= (uintptr_t)string)
  223. && ((uintptr_t)string <= (uintptr_t)puf->e->end));
  224. KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
  225. kfree(string);
  226. }
  227. static void policy_unpack_test_unpack_strdup_with_name(struct kunit *test)
  228. {
  229. struct policy_unpack_fixture *puf = test->priv;
  230. char *string = NULL;
  231. size_t size;
  232. size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
  233. KUNIT_EXPECT_EQ(test, size, strlen(TEST_STRING_DATA) + 1);
  234. KUNIT_EXPECT_FALSE(test,
  235. ((uintptr_t)puf->e->start <= (uintptr_t)string)
  236. && ((uintptr_t)string <= (uintptr_t)puf->e->end));
  237. KUNIT_EXPECT_STREQ(test, string, TEST_STRING_DATA);
  238. kfree(string);
  239. }
  240. static void policy_unpack_test_unpack_strdup_out_of_bounds(struct kunit *test)
  241. {
  242. struct policy_unpack_fixture *puf = test->priv;
  243. void *start = puf->e->pos;
  244. char *string = NULL;
  245. int size;
  246. puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
  247. + strlen(TEST_STRING_DATA) - 1;
  248. size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
  249. KUNIT_EXPECT_EQ(test, size, 0);
  250. KUNIT_EXPECT_NULL(test, string);
  251. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
  252. kfree(string);
  253. }
  254. static void policy_unpack_test_unpack_nameX_with_null_name(struct kunit *test)
  255. {
  256. struct policy_unpack_fixture *puf = test->priv;
  257. bool success;
  258. puf->e->pos += TEST_U32_BUF_OFFSET;
  259. success = aa_unpack_nameX(puf->e, AA_U32, NULL);
  260. KUNIT_EXPECT_TRUE(test, success);
  261. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  262. puf->e->start + TEST_U32_BUF_OFFSET + 1);
  263. }
  264. static void policy_unpack_test_unpack_nameX_with_wrong_code(struct kunit *test)
  265. {
  266. struct policy_unpack_fixture *puf = test->priv;
  267. bool success;
  268. puf->e->pos += TEST_U32_BUF_OFFSET;
  269. success = aa_unpack_nameX(puf->e, AA_BLOB, NULL);
  270. KUNIT_EXPECT_FALSE(test, success);
  271. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  272. puf->e->start + TEST_U32_BUF_OFFSET);
  273. }
  274. static void policy_unpack_test_unpack_nameX_with_name(struct kunit *test)
  275. {
  276. struct policy_unpack_fixture *puf = test->priv;
  277. const char name[] = TEST_U32_NAME;
  278. bool success;
  279. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  280. success = aa_unpack_nameX(puf->e, AA_U32, name);
  281. KUNIT_EXPECT_TRUE(test, success);
  282. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  283. puf->e->start + TEST_U32_BUF_OFFSET + 1);
  284. }
  285. static void policy_unpack_test_unpack_nameX_with_wrong_name(struct kunit *test)
  286. {
  287. struct policy_unpack_fixture *puf = test->priv;
  288. static const char name[] = "12345678";
  289. bool success;
  290. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  291. success = aa_unpack_nameX(puf->e, AA_U32, name);
  292. KUNIT_EXPECT_FALSE(test, success);
  293. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  294. puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
  295. }
  296. static void policy_unpack_test_unpack_u16_chunk_basic(struct kunit *test)
  297. {
  298. struct policy_unpack_fixture *puf = test->priv;
  299. char *chunk = NULL;
  300. size_t size;
  301. puf->e->pos += TEST_U16_OFFSET;
  302. /*
  303. * WARNING: For unit testing purposes, we're pushing puf->e->end past
  304. * the end of the allocated memory. Doing anything other than comparing
  305. * memory addresses is dangerous.
  306. */
  307. puf->e->end += TEST_U16_DATA;
  308. size = aa_unpack_u16_chunk(puf->e, &chunk);
  309. KUNIT_EXPECT_PTR_EQ(test, chunk,
  310. puf->e->start + TEST_U16_OFFSET + 2);
  311. KUNIT_EXPECT_EQ(test, size, TEST_U16_DATA);
  312. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, (chunk + TEST_U16_DATA));
  313. }
  314. static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_1(
  315. struct kunit *test)
  316. {
  317. struct policy_unpack_fixture *puf = test->priv;
  318. char *chunk = NULL;
  319. size_t size;
  320. puf->e->pos = puf->e->end - 1;
  321. size = aa_unpack_u16_chunk(puf->e, &chunk);
  322. KUNIT_EXPECT_EQ(test, size, 0);
  323. KUNIT_EXPECT_NULL(test, chunk);
  324. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->end - 1);
  325. }
  326. static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_2(
  327. struct kunit *test)
  328. {
  329. struct policy_unpack_fixture *puf = test->priv;
  330. char *chunk = NULL;
  331. size_t size;
  332. puf->e->pos += TEST_U16_OFFSET;
  333. /*
  334. * WARNING: For unit testing purposes, we're pushing puf->e->end past
  335. * the end of the allocated memory. Doing anything other than comparing
  336. * memory addresses is dangerous.
  337. */
  338. puf->e->end = puf->e->pos + TEST_U16_DATA - 1;
  339. size = aa_unpack_u16_chunk(puf->e, &chunk);
  340. KUNIT_EXPECT_EQ(test, size, 0);
  341. KUNIT_EXPECT_NULL(test, chunk);
  342. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->start + TEST_U16_OFFSET);
  343. }
  344. static void policy_unpack_test_unpack_u32_with_null_name(struct kunit *test)
  345. {
  346. struct policy_unpack_fixture *puf = test->priv;
  347. bool success;
  348. u32 data = 0;
  349. puf->e->pos += TEST_U32_BUF_OFFSET;
  350. success = aa_unpack_u32(puf->e, &data, NULL);
  351. KUNIT_EXPECT_TRUE(test, success);
  352. KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
  353. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  354. puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
  355. }
  356. static void policy_unpack_test_unpack_u32_with_name(struct kunit *test)
  357. {
  358. struct policy_unpack_fixture *puf = test->priv;
  359. const char name[] = TEST_U32_NAME;
  360. bool success;
  361. u32 data = 0;
  362. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  363. success = aa_unpack_u32(puf->e, &data, name);
  364. KUNIT_EXPECT_TRUE(test, success);
  365. KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
  366. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  367. puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
  368. }
  369. static void policy_unpack_test_unpack_u32_out_of_bounds(struct kunit *test)
  370. {
  371. struct policy_unpack_fixture *puf = test->priv;
  372. const char name[] = TEST_U32_NAME;
  373. bool success;
  374. u32 data = 0;
  375. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  376. puf->e->end = puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32);
  377. success = aa_unpack_u32(puf->e, &data, name);
  378. KUNIT_EXPECT_FALSE(test, success);
  379. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  380. puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
  381. }
  382. static void policy_unpack_test_unpack_u64_with_null_name(struct kunit *test)
  383. {
  384. struct policy_unpack_fixture *puf = test->priv;
  385. bool success;
  386. u64 data = 0;
  387. puf->e->pos += TEST_U64_BUF_OFFSET;
  388. success = aa_unpack_u64(puf->e, &data, NULL);
  389. KUNIT_EXPECT_TRUE(test, success);
  390. KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
  391. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  392. puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
  393. }
  394. static void policy_unpack_test_unpack_u64_with_name(struct kunit *test)
  395. {
  396. struct policy_unpack_fixture *puf = test->priv;
  397. const char name[] = TEST_U64_NAME;
  398. bool success;
  399. u64 data = 0;
  400. puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
  401. success = aa_unpack_u64(puf->e, &data, name);
  402. KUNIT_EXPECT_TRUE(test, success);
  403. KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
  404. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  405. puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
  406. }
  407. static void policy_unpack_test_unpack_u64_out_of_bounds(struct kunit *test)
  408. {
  409. struct policy_unpack_fixture *puf = test->priv;
  410. const char name[] = TEST_U64_NAME;
  411. bool success;
  412. u64 data = 0;
  413. puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
  414. puf->e->end = puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64);
  415. success = aa_unpack_u64(puf->e, &data, name);
  416. KUNIT_EXPECT_FALSE(test, success);
  417. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  418. puf->e->start + TEST_NAMED_U64_BUF_OFFSET);
  419. }
  420. static void policy_unpack_test_unpack_X_code_match(struct kunit *test)
  421. {
  422. struct policy_unpack_fixture *puf = test->priv;
  423. bool success = aa_unpack_X(puf->e, AA_NAME);
  424. KUNIT_EXPECT_TRUE(test, success);
  425. KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start + 1);
  426. }
  427. static void policy_unpack_test_unpack_X_code_mismatch(struct kunit *test)
  428. {
  429. struct policy_unpack_fixture *puf = test->priv;
  430. bool success = aa_unpack_X(puf->e, AA_STRING);
  431. KUNIT_EXPECT_FALSE(test, success);
  432. KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start);
  433. }
  434. static void policy_unpack_test_unpack_X_out_of_bounds(struct kunit *test)
  435. {
  436. struct policy_unpack_fixture *puf = test->priv;
  437. bool success;
  438. puf->e->pos = puf->e->end;
  439. success = aa_unpack_X(puf->e, AA_NAME);
  440. KUNIT_EXPECT_FALSE(test, success);
  441. }
  442. static struct kunit_case apparmor_policy_unpack_test_cases[] = {
  443. KUNIT_CASE(policy_unpack_test_inbounds_when_inbounds),
  444. KUNIT_CASE(policy_unpack_test_inbounds_when_out_of_bounds),
  445. KUNIT_CASE(policy_unpack_test_unpack_array_with_null_name),
  446. KUNIT_CASE(policy_unpack_test_unpack_array_with_name),
  447. KUNIT_CASE(policy_unpack_test_unpack_array_out_of_bounds),
  448. KUNIT_CASE(policy_unpack_test_unpack_blob_with_null_name),
  449. KUNIT_CASE(policy_unpack_test_unpack_blob_with_name),
  450. KUNIT_CASE(policy_unpack_test_unpack_blob_out_of_bounds),
  451. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_null_name),
  452. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_code),
  453. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_name),
  454. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_name),
  455. KUNIT_CASE(policy_unpack_test_unpack_str_with_null_name),
  456. KUNIT_CASE(policy_unpack_test_unpack_str_with_name),
  457. KUNIT_CASE(policy_unpack_test_unpack_str_out_of_bounds),
  458. KUNIT_CASE(policy_unpack_test_unpack_strdup_with_null_name),
  459. KUNIT_CASE(policy_unpack_test_unpack_strdup_with_name),
  460. KUNIT_CASE(policy_unpack_test_unpack_strdup_out_of_bounds),
  461. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_basic),
  462. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_1),
  463. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_2),
  464. KUNIT_CASE(policy_unpack_test_unpack_u32_with_null_name),
  465. KUNIT_CASE(policy_unpack_test_unpack_u32_with_name),
  466. KUNIT_CASE(policy_unpack_test_unpack_u32_out_of_bounds),
  467. KUNIT_CASE(policy_unpack_test_unpack_u64_with_null_name),
  468. KUNIT_CASE(policy_unpack_test_unpack_u64_with_name),
  469. KUNIT_CASE(policy_unpack_test_unpack_u64_out_of_bounds),
  470. KUNIT_CASE(policy_unpack_test_unpack_X_code_match),
  471. KUNIT_CASE(policy_unpack_test_unpack_X_code_mismatch),
  472. KUNIT_CASE(policy_unpack_test_unpack_X_out_of_bounds),
  473. {},
  474. };
  475. static struct kunit_suite apparmor_policy_unpack_test_module = {
  476. .name = "apparmor_policy_unpack",
  477. .init = policy_unpack_test_init,
  478. .test_cases = apparmor_policy_unpack_test_cases,
  479. };
  480. kunit_test_suite(apparmor_policy_unpack_test_module);
  481. MODULE_DESCRIPTION("KUnit tests for AppArmor's policy unpack");
  482. MODULE_LICENSE("GPL");