map_kptr.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. /* Common tests */
  2. {
  3. "map_kptr: BPF_ST imm != 0",
  4. .insns = {
  5. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  6. BPF_LD_MAP_FD(BPF_REG_6, 0),
  7. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  8. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  9. BPF_MOV64_IMM(BPF_REG_0, 0),
  10. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  11. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  12. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  13. BPF_EXIT_INSN(),
  14. BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
  15. BPF_EXIT_INSN(),
  16. },
  17. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  18. .fixup_map_kptr = { 1 },
  19. .result = REJECT,
  20. .errstr = "BPF_ST imm must be 0 when storing to kptr at off=0",
  21. },
  22. {
  23. "map_kptr: size != bpf_size_to_bytes(BPF_DW)",
  24. .insns = {
  25. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  26. BPF_LD_MAP_FD(BPF_REG_6, 0),
  27. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  28. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  29. BPF_MOV64_IMM(BPF_REG_0, 0),
  30. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  31. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  32. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  33. BPF_EXIT_INSN(),
  34. BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
  35. BPF_EXIT_INSN(),
  36. },
  37. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  38. .fixup_map_kptr = { 1 },
  39. .result = REJECT,
  40. .errstr = "kptr access size must be BPF_DW",
  41. },
  42. {
  43. "map_kptr: map_value non-const var_off",
  44. .insns = {
  45. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  46. BPF_LD_MAP_FD(BPF_REG_6, 0),
  47. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  48. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  49. BPF_MOV64_IMM(BPF_REG_0, 0),
  50. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  51. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  52. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  53. BPF_EXIT_INSN(),
  54. BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
  55. BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
  56. BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
  57. BPF_EXIT_INSN(),
  58. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
  59. BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
  60. BPF_EXIT_INSN(),
  61. BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
  62. BPF_EXIT_INSN(),
  63. BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
  64. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
  65. BPF_EXIT_INSN(),
  66. },
  67. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  68. .fixup_map_kptr = { 1 },
  69. .result = REJECT,
  70. .errstr = "kptr access cannot have variable offset",
  71. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  72. },
  73. {
  74. "map_kptr: bpf_kptr_xchg non-const var_off",
  75. .insns = {
  76. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  77. BPF_LD_MAP_FD(BPF_REG_6, 0),
  78. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  79. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  80. BPF_MOV64_IMM(BPF_REG_0, 0),
  81. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  82. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  83. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  84. BPF_EXIT_INSN(),
  85. BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
  86. BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
  87. BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
  88. BPF_EXIT_INSN(),
  89. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
  90. BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
  91. BPF_EXIT_INSN(),
  92. BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
  93. BPF_EXIT_INSN(),
  94. BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
  95. BPF_MOV64_REG(BPF_REG_1, BPF_REG_3),
  96. BPF_MOV64_IMM(BPF_REG_2, 0),
  97. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
  98. BPF_EXIT_INSN(),
  99. },
  100. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  101. .fixup_map_kptr = { 1 },
  102. .result = REJECT,
  103. .errstr = "R1 doesn't have constant offset. kptr has to be at the constant offset",
  104. },
  105. {
  106. "map_kptr: unaligned boundary load/store",
  107. .insns = {
  108. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  109. BPF_LD_MAP_FD(BPF_REG_6, 0),
  110. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  111. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  112. BPF_MOV64_IMM(BPF_REG_0, 0),
  113. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  114. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  115. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  116. BPF_EXIT_INSN(),
  117. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 7),
  118. BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
  119. BPF_EXIT_INSN(),
  120. },
  121. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  122. .fixup_map_kptr = { 1 },
  123. .result = REJECT,
  124. .errstr = "kptr access misaligned expected=0 off=7",
  125. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  126. },
  127. {
  128. "map_kptr: reject var_off != 0",
  129. .insns = {
  130. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  131. BPF_LD_MAP_FD(BPF_REG_6, 0),
  132. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  133. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  134. BPF_MOV64_IMM(BPF_REG_0, 0),
  135. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  136. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  137. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  138. BPF_EXIT_INSN(),
  139. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
  140. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
  141. BPF_EXIT_INSN(),
  142. BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
  143. BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
  144. BPF_EXIT_INSN(),
  145. BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
  146. BPF_EXIT_INSN(),
  147. BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
  148. BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
  149. BPF_EXIT_INSN(),
  150. },
  151. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  152. .fixup_map_kptr = { 1 },
  153. .result = REJECT,
  154. .errstr = "variable untrusted_ptr_ access var_off=(0x0; 0x7) disallowed",
  155. },
  156. /* Tests for unreferenced PTR_TO_BTF_ID */
  157. {
  158. "map_kptr: unref: reject btf_struct_ids_match == false",
  159. .insns = {
  160. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  161. BPF_LD_MAP_FD(BPF_REG_6, 0),
  162. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  163. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  164. BPF_MOV64_IMM(BPF_REG_0, 0),
  165. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  166. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  167. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  168. BPF_EXIT_INSN(),
  169. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
  170. BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
  171. BPF_EXIT_INSN(),
  172. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
  173. BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
  174. BPF_EXIT_INSN(),
  175. },
  176. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  177. .fixup_map_kptr = { 1 },
  178. .result = REJECT,
  179. .errstr = "invalid kptr access, R1 type=untrusted_ptr_prog_test_ref_kfunc expected=ptr_prog_test",
  180. },
  181. {
  182. "map_kptr: unref: loaded pointer marked as untrusted",
  183. .insns = {
  184. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  185. BPF_LD_MAP_FD(BPF_REG_6, 0),
  186. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  187. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  188. BPF_MOV64_IMM(BPF_REG_0, 0),
  189. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  190. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  191. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  192. BPF_EXIT_INSN(),
  193. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  194. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
  195. BPF_EXIT_INSN(),
  196. },
  197. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  198. .fixup_map_kptr = { 1 },
  199. .result = REJECT,
  200. .errstr = "R0 invalid mem access 'untrusted_ptr_or_null_'",
  201. },
  202. {
  203. "map_kptr: unref: correct in kernel type size",
  204. .insns = {
  205. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  206. BPF_LD_MAP_FD(BPF_REG_6, 0),
  207. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  208. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  209. BPF_MOV64_IMM(BPF_REG_0, 0),
  210. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  211. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  212. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  213. BPF_EXIT_INSN(),
  214. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  215. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  216. BPF_EXIT_INSN(),
  217. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 32),
  218. BPF_EXIT_INSN(),
  219. },
  220. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  221. .fixup_map_kptr = { 1 },
  222. .result = REJECT,
  223. .errstr = "access beyond struct prog_test_ref_kfunc at off 32 size 8",
  224. },
  225. {
  226. "map_kptr: unref: inherit PTR_UNTRUSTED on struct walk",
  227. .insns = {
  228. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  229. BPF_LD_MAP_FD(BPF_REG_6, 0),
  230. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  231. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  232. BPF_MOV64_IMM(BPF_REG_0, 0),
  233. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  234. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  235. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  236. BPF_EXIT_INSN(),
  237. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  238. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  239. BPF_EXIT_INSN(),
  240. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 16),
  241. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
  242. BPF_EXIT_INSN(),
  243. },
  244. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  245. .fixup_map_kptr = { 1 },
  246. .result = REJECT,
  247. .errstr = "R1 type=untrusted_ptr_ expected=percpu_ptr_",
  248. },
  249. {
  250. "map_kptr: unref: no reference state created",
  251. .insns = {
  252. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  253. BPF_LD_MAP_FD(BPF_REG_6, 0),
  254. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  255. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  256. BPF_MOV64_IMM(BPF_REG_0, 0),
  257. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  258. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  259. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  260. BPF_EXIT_INSN(),
  261. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  262. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  263. BPF_EXIT_INSN(),
  264. BPF_EXIT_INSN(),
  265. },
  266. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  267. .fixup_map_kptr = { 1 },
  268. .result = ACCEPT,
  269. },
  270. {
  271. "map_kptr: unref: bpf_kptr_xchg rejected",
  272. .insns = {
  273. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  274. BPF_LD_MAP_FD(BPF_REG_6, 0),
  275. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  276. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  277. BPF_MOV64_IMM(BPF_REG_0, 0),
  278. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  279. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  280. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  281. BPF_EXIT_INSN(),
  282. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  283. BPF_MOV64_IMM(BPF_REG_2, 0),
  284. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
  285. BPF_MOV64_IMM(BPF_REG_0, 0),
  286. BPF_EXIT_INSN(),
  287. },
  288. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  289. .fixup_map_kptr = { 1 },
  290. .result = REJECT,
  291. .errstr = "off=0 kptr isn't referenced kptr",
  292. },
  293. /* Tests for referenced PTR_TO_BTF_ID */
  294. {
  295. "map_kptr: ref: loaded pointer marked as untrusted",
  296. .insns = {
  297. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  298. BPF_LD_MAP_FD(BPF_REG_6, 0),
  299. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  300. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  301. BPF_MOV64_IMM(BPF_REG_0, 0),
  302. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  303. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  304. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  305. BPF_EXIT_INSN(),
  306. BPF_MOV64_IMM(BPF_REG_1, 0),
  307. BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 8),
  308. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
  309. BPF_EXIT_INSN(),
  310. },
  311. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  312. .fixup_map_kptr = { 1 },
  313. .result = REJECT,
  314. .errstr = "R1 type=rcu_ptr_or_null_ expected=percpu_ptr_",
  315. },
  316. {
  317. "map_kptr: ref: reject off != 0",
  318. .insns = {
  319. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  320. BPF_LD_MAP_FD(BPF_REG_6, 0),
  321. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  322. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  323. BPF_MOV64_IMM(BPF_REG_0, 0),
  324. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  325. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  326. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  327. BPF_EXIT_INSN(),
  328. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  329. BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
  330. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  331. BPF_MOV64_IMM(BPF_REG_2, 0),
  332. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
  333. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  334. BPF_EXIT_INSN(),
  335. BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
  336. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
  337. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  338. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  339. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
  340. BPF_EXIT_INSN(),
  341. },
  342. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  343. .fixup_map_kptr = { 1 },
  344. .result = REJECT,
  345. .errstr = "invalid kptr access, R2 type=ptr_prog_test_ref_kfunc expected=ptr_prog_test_member",
  346. },
  347. {
  348. "map_kptr: ref: reference state created and released on xchg",
  349. .insns = {
  350. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  351. BPF_LD_MAP_FD(BPF_REG_6, 0),
  352. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  353. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  354. BPF_MOV64_IMM(BPF_REG_0, 0),
  355. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  356. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  357. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  358. BPF_EXIT_INSN(),
  359. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
  360. BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
  361. BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  362. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
  363. BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
  364. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
  365. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  366. BPF_EXIT_INSN(),
  367. BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
  368. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  369. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
  370. BPF_MOV64_IMM(BPF_REG_0, 0),
  371. BPF_EXIT_INSN(),
  372. },
  373. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  374. .fixup_map_kptr = { 1 },
  375. .result = REJECT,
  376. .errstr = "Unreleased reference id=5 alloc_insn=20",
  377. .fixup_kfunc_btf_id = {
  378. { "bpf_kfunc_call_test_acquire", 15 },
  379. }
  380. },
  381. {
  382. "map_kptr: ref: reject STX",
  383. .insns = {
  384. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  385. BPF_LD_MAP_FD(BPF_REG_6, 0),
  386. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  387. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  388. BPF_MOV64_IMM(BPF_REG_0, 0),
  389. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  390. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  391. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  392. BPF_EXIT_INSN(),
  393. BPF_MOV64_REG(BPF_REG_1, 0),
  394. BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
  395. BPF_EXIT_INSN(),
  396. },
  397. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  398. .fixup_map_kptr = { 1 },
  399. .result = REJECT,
  400. .errstr = "store to referenced kptr disallowed",
  401. },
  402. {
  403. "map_kptr: ref: reject ST",
  404. .insns = {
  405. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  406. BPF_LD_MAP_FD(BPF_REG_6, 0),
  407. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  408. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  409. BPF_MOV64_IMM(BPF_REG_0, 0),
  410. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  411. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  412. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  413. BPF_EXIT_INSN(),
  414. BPF_ST_MEM(BPF_DW, BPF_REG_0, 8, 0),
  415. BPF_EXIT_INSN(),
  416. },
  417. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  418. .fixup_map_kptr = { 1 },
  419. .result = REJECT,
  420. .errstr = "store to referenced kptr disallowed",
  421. },
  422. {
  423. "map_kptr: reject helper access to kptr",
  424. .insns = {
  425. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  426. BPF_LD_MAP_FD(BPF_REG_6, 0),
  427. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  428. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
  429. BPF_MOV64_IMM(BPF_REG_0, 0),
  430. BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
  431. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  432. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  433. BPF_EXIT_INSN(),
  434. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  435. BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
  436. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  437. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_delete_elem),
  438. BPF_EXIT_INSN(),
  439. },
  440. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  441. .fixup_map_kptr = { 1 },
  442. .result = REJECT,
  443. .errstr = "kptr cannot be accessed indirectly by helper",
  444. },