policy_unpack_test.c 18 KB

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