policy_unpack_test.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  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. strcpy(buf + 3, TEST_STRING_NAME);
  58. buf = e->start + TEST_STRING_BUF_OFFSET;
  59. *buf = AA_STRING;
  60. *(buf + 1) = strlen(TEST_STRING_DATA) + 1;
  61. strcpy(buf + 3, TEST_STRING_DATA);
  62. buf = e->start + TEST_NAMED_U32_BUF_OFFSET;
  63. *buf = AA_NAME;
  64. *(buf + 1) = strlen(TEST_U32_NAME) + 1;
  65. strcpy(buf + 3, TEST_U32_NAME);
  66. *(buf + 3 + strlen(TEST_U32_NAME) + 1) = AA_U32;
  67. *((u32 *)(buf + 3 + strlen(TEST_U32_NAME) + 2)) = 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. strcpy(buf + 3, TEST_U64_NAME);
  72. *(buf + 3 + strlen(TEST_U64_NAME) + 1) = AA_U64;
  73. *((u64 *)(buf + 3 + strlen(TEST_U64_NAME) + 2)) = 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. strcpy(buf + 3, TEST_BLOB_NAME);
  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. strcpy(buf + 3, TEST_ARRAY_NAME);
  86. *(buf + 3 + strlen(TEST_ARRAY_NAME) + 1) = AA_ARRAY;
  87. *((u16 *)(buf + 3 + strlen(TEST_ARRAY_NAME) + 2)) = 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;
  117. puf->e->pos += TEST_ARRAY_BUF_OFFSET;
  118. array_size = aa_unpack_array(puf->e, NULL);
  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;
  128. puf->e->pos += TEST_NAMED_ARRAY_BUF_OFFSET;
  129. array_size = aa_unpack_array(puf->e, name);
  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. array_size = aa_unpack_array(puf->e, name);
  142. KUNIT_EXPECT_EQ(test, array_size, 0);
  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. }
  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. }
  238. static void policy_unpack_test_unpack_strdup_out_of_bounds(struct kunit *test)
  239. {
  240. struct policy_unpack_fixture *puf = test->priv;
  241. void *start = puf->e->pos;
  242. char *string = NULL;
  243. int size;
  244. puf->e->end = puf->e->pos + TEST_STRING_BUF_OFFSET
  245. + strlen(TEST_STRING_DATA) - 1;
  246. size = aa_unpack_strdup(puf->e, &string, TEST_STRING_NAME);
  247. KUNIT_EXPECT_EQ(test, size, 0);
  248. KUNIT_EXPECT_NULL(test, string);
  249. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, start);
  250. }
  251. static void policy_unpack_test_unpack_nameX_with_null_name(struct kunit *test)
  252. {
  253. struct policy_unpack_fixture *puf = test->priv;
  254. bool success;
  255. puf->e->pos += TEST_U32_BUF_OFFSET;
  256. success = aa_unpack_nameX(puf->e, AA_U32, NULL);
  257. KUNIT_EXPECT_TRUE(test, success);
  258. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  259. puf->e->start + TEST_U32_BUF_OFFSET + 1);
  260. }
  261. static void policy_unpack_test_unpack_nameX_with_wrong_code(struct kunit *test)
  262. {
  263. struct policy_unpack_fixture *puf = test->priv;
  264. bool success;
  265. puf->e->pos += TEST_U32_BUF_OFFSET;
  266. success = aa_unpack_nameX(puf->e, AA_BLOB, NULL);
  267. KUNIT_EXPECT_FALSE(test, success);
  268. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  269. puf->e->start + TEST_U32_BUF_OFFSET);
  270. }
  271. static void policy_unpack_test_unpack_nameX_with_name(struct kunit *test)
  272. {
  273. struct policy_unpack_fixture *puf = test->priv;
  274. const char name[] = TEST_U32_NAME;
  275. bool success;
  276. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  277. success = aa_unpack_nameX(puf->e, AA_U32, name);
  278. KUNIT_EXPECT_TRUE(test, success);
  279. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  280. puf->e->start + TEST_U32_BUF_OFFSET + 1);
  281. }
  282. static void policy_unpack_test_unpack_nameX_with_wrong_name(struct kunit *test)
  283. {
  284. struct policy_unpack_fixture *puf = test->priv;
  285. static const char name[] = "12345678";
  286. bool success;
  287. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  288. success = aa_unpack_nameX(puf->e, AA_U32, name);
  289. KUNIT_EXPECT_FALSE(test, success);
  290. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  291. puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
  292. }
  293. static void policy_unpack_test_unpack_u16_chunk_basic(struct kunit *test)
  294. {
  295. struct policy_unpack_fixture *puf = test->priv;
  296. char *chunk = NULL;
  297. size_t size;
  298. puf->e->pos += TEST_U16_OFFSET;
  299. /*
  300. * WARNING: For unit testing purposes, we're pushing puf->e->end past
  301. * the end of the allocated memory. Doing anything other than comparing
  302. * memory addresses is dangerous.
  303. */
  304. puf->e->end += TEST_U16_DATA;
  305. size = aa_unpack_u16_chunk(puf->e, &chunk);
  306. KUNIT_EXPECT_PTR_EQ(test, chunk,
  307. puf->e->start + TEST_U16_OFFSET + 2);
  308. KUNIT_EXPECT_EQ(test, size, TEST_U16_DATA);
  309. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, (chunk + TEST_U16_DATA));
  310. }
  311. static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_1(
  312. struct kunit *test)
  313. {
  314. struct policy_unpack_fixture *puf = test->priv;
  315. char *chunk = NULL;
  316. size_t size;
  317. puf->e->pos = puf->e->end - 1;
  318. size = aa_unpack_u16_chunk(puf->e, &chunk);
  319. KUNIT_EXPECT_EQ(test, size, 0);
  320. KUNIT_EXPECT_NULL(test, chunk);
  321. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->end - 1);
  322. }
  323. static void policy_unpack_test_unpack_u16_chunk_out_of_bounds_2(
  324. struct kunit *test)
  325. {
  326. struct policy_unpack_fixture *puf = test->priv;
  327. char *chunk = NULL;
  328. size_t size;
  329. puf->e->pos += TEST_U16_OFFSET;
  330. /*
  331. * WARNING: For unit testing purposes, we're pushing puf->e->end past
  332. * the end of the allocated memory. Doing anything other than comparing
  333. * memory addresses is dangerous.
  334. */
  335. puf->e->end = puf->e->pos + TEST_U16_DATA - 1;
  336. size = aa_unpack_u16_chunk(puf->e, &chunk);
  337. KUNIT_EXPECT_EQ(test, size, 0);
  338. KUNIT_EXPECT_NULL(test, chunk);
  339. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos, puf->e->start + TEST_U16_OFFSET);
  340. }
  341. static void policy_unpack_test_unpack_u32_with_null_name(struct kunit *test)
  342. {
  343. struct policy_unpack_fixture *puf = test->priv;
  344. bool success;
  345. u32 data = 0;
  346. puf->e->pos += TEST_U32_BUF_OFFSET;
  347. success = aa_unpack_u32(puf->e, &data, NULL);
  348. KUNIT_EXPECT_TRUE(test, success);
  349. KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
  350. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  351. puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
  352. }
  353. static void policy_unpack_test_unpack_u32_with_name(struct kunit *test)
  354. {
  355. struct policy_unpack_fixture *puf = test->priv;
  356. const char name[] = TEST_U32_NAME;
  357. bool success;
  358. u32 data = 0;
  359. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  360. success = aa_unpack_u32(puf->e, &data, name);
  361. KUNIT_EXPECT_TRUE(test, success);
  362. KUNIT_EXPECT_EQ(test, data, TEST_U32_DATA);
  363. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  364. puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32) + 1);
  365. }
  366. static void policy_unpack_test_unpack_u32_out_of_bounds(struct kunit *test)
  367. {
  368. struct policy_unpack_fixture *puf = test->priv;
  369. const char name[] = TEST_U32_NAME;
  370. bool success;
  371. u32 data = 0;
  372. puf->e->pos += TEST_NAMED_U32_BUF_OFFSET;
  373. puf->e->end = puf->e->start + TEST_U32_BUF_OFFSET + sizeof(u32);
  374. success = aa_unpack_u32(puf->e, &data, name);
  375. KUNIT_EXPECT_FALSE(test, success);
  376. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  377. puf->e->start + TEST_NAMED_U32_BUF_OFFSET);
  378. }
  379. static void policy_unpack_test_unpack_u64_with_null_name(struct kunit *test)
  380. {
  381. struct policy_unpack_fixture *puf = test->priv;
  382. bool success;
  383. u64 data = 0;
  384. puf->e->pos += TEST_U64_BUF_OFFSET;
  385. success = aa_unpack_u64(puf->e, &data, NULL);
  386. KUNIT_EXPECT_TRUE(test, success);
  387. KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
  388. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  389. puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
  390. }
  391. static void policy_unpack_test_unpack_u64_with_name(struct kunit *test)
  392. {
  393. struct policy_unpack_fixture *puf = test->priv;
  394. const char name[] = TEST_U64_NAME;
  395. bool success;
  396. u64 data = 0;
  397. puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
  398. success = aa_unpack_u64(puf->e, &data, name);
  399. KUNIT_EXPECT_TRUE(test, success);
  400. KUNIT_EXPECT_EQ(test, data, TEST_U64_DATA);
  401. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  402. puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64) + 1);
  403. }
  404. static void policy_unpack_test_unpack_u64_out_of_bounds(struct kunit *test)
  405. {
  406. struct policy_unpack_fixture *puf = test->priv;
  407. const char name[] = TEST_U64_NAME;
  408. bool success;
  409. u64 data = 0;
  410. puf->e->pos += TEST_NAMED_U64_BUF_OFFSET;
  411. puf->e->end = puf->e->start + TEST_U64_BUF_OFFSET + sizeof(u64);
  412. success = aa_unpack_u64(puf->e, &data, name);
  413. KUNIT_EXPECT_FALSE(test, success);
  414. KUNIT_EXPECT_PTR_EQ(test, puf->e->pos,
  415. puf->e->start + TEST_NAMED_U64_BUF_OFFSET);
  416. }
  417. static void policy_unpack_test_unpack_X_code_match(struct kunit *test)
  418. {
  419. struct policy_unpack_fixture *puf = test->priv;
  420. bool success = aa_unpack_X(puf->e, AA_NAME);
  421. KUNIT_EXPECT_TRUE(test, success);
  422. KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start + 1);
  423. }
  424. static void policy_unpack_test_unpack_X_code_mismatch(struct kunit *test)
  425. {
  426. struct policy_unpack_fixture *puf = test->priv;
  427. bool success = aa_unpack_X(puf->e, AA_STRING);
  428. KUNIT_EXPECT_FALSE(test, success);
  429. KUNIT_EXPECT_TRUE(test, puf->e->pos == puf->e->start);
  430. }
  431. static void policy_unpack_test_unpack_X_out_of_bounds(struct kunit *test)
  432. {
  433. struct policy_unpack_fixture *puf = test->priv;
  434. bool success;
  435. puf->e->pos = puf->e->end;
  436. success = aa_unpack_X(puf->e, AA_NAME);
  437. KUNIT_EXPECT_FALSE(test, success);
  438. }
  439. static struct kunit_case apparmor_policy_unpack_test_cases[] = {
  440. KUNIT_CASE(policy_unpack_test_inbounds_when_inbounds),
  441. KUNIT_CASE(policy_unpack_test_inbounds_when_out_of_bounds),
  442. KUNIT_CASE(policy_unpack_test_unpack_array_with_null_name),
  443. KUNIT_CASE(policy_unpack_test_unpack_array_with_name),
  444. KUNIT_CASE(policy_unpack_test_unpack_array_out_of_bounds),
  445. KUNIT_CASE(policy_unpack_test_unpack_blob_with_null_name),
  446. KUNIT_CASE(policy_unpack_test_unpack_blob_with_name),
  447. KUNIT_CASE(policy_unpack_test_unpack_blob_out_of_bounds),
  448. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_null_name),
  449. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_code),
  450. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_name),
  451. KUNIT_CASE(policy_unpack_test_unpack_nameX_with_wrong_name),
  452. KUNIT_CASE(policy_unpack_test_unpack_str_with_null_name),
  453. KUNIT_CASE(policy_unpack_test_unpack_str_with_name),
  454. KUNIT_CASE(policy_unpack_test_unpack_str_out_of_bounds),
  455. KUNIT_CASE(policy_unpack_test_unpack_strdup_with_null_name),
  456. KUNIT_CASE(policy_unpack_test_unpack_strdup_with_name),
  457. KUNIT_CASE(policy_unpack_test_unpack_strdup_out_of_bounds),
  458. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_basic),
  459. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_1),
  460. KUNIT_CASE(policy_unpack_test_unpack_u16_chunk_out_of_bounds_2),
  461. KUNIT_CASE(policy_unpack_test_unpack_u32_with_null_name),
  462. KUNIT_CASE(policy_unpack_test_unpack_u32_with_name),
  463. KUNIT_CASE(policy_unpack_test_unpack_u32_out_of_bounds),
  464. KUNIT_CASE(policy_unpack_test_unpack_u64_with_null_name),
  465. KUNIT_CASE(policy_unpack_test_unpack_u64_with_name),
  466. KUNIT_CASE(policy_unpack_test_unpack_u64_out_of_bounds),
  467. KUNIT_CASE(policy_unpack_test_unpack_X_code_match),
  468. KUNIT_CASE(policy_unpack_test_unpack_X_code_mismatch),
  469. KUNIT_CASE(policy_unpack_test_unpack_X_out_of_bounds),
  470. {},
  471. };
  472. static struct kunit_suite apparmor_policy_unpack_test_module = {
  473. .name = "apparmor_policy_unpack",
  474. .init = policy_unpack_test_init,
  475. .test_cases = apparmor_policy_unpack_test_cases,
  476. };
  477. kunit_test_suite(apparmor_policy_unpack_test_module);
  478. MODULE_LICENSE("GPL");