dead_code.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. {
  2. "dead code: start",
  3. .insns = {
  4. BPF_JMP_IMM(BPF_JA, 0, 0, 2),
  5. /* unpriv: nospec (inserted to prevent "R9 !read_ok") */
  6. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  7. BPF_JMP_IMM(BPF_JA, 0, 0, 2),
  8. BPF_MOV64_IMM(BPF_REG_0, 7),
  9. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, -4),
  10. BPF_EXIT_INSN(),
  11. },
  12. .result = ACCEPT,
  13. .retval = 7,
  14. },
  15. {
  16. "dead code: mid 1",
  17. .insns = {
  18. BPF_MOV64_IMM(BPF_REG_0, 7),
  19. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
  20. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 0),
  21. BPF_EXIT_INSN(),
  22. },
  23. .result = ACCEPT,
  24. .retval = 7,
  25. },
  26. {
  27. "dead code: mid 2",
  28. .insns = {
  29. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  30. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 4),
  31. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
  32. BPF_JMP_IMM(BPF_JA, 0, 0, 2),
  33. BPF_MOV64_IMM(BPF_REG_0, 7),
  34. BPF_EXIT_INSN(),
  35. BPF_MOV64_IMM(BPF_REG_0, 1),
  36. BPF_EXIT_INSN(),
  37. },
  38. .result = ACCEPT,
  39. .retval = 1,
  40. },
  41. {
  42. "dead code: end 1",
  43. .insns = {
  44. BPF_MOV64_IMM(BPF_REG_0, 7),
  45. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
  46. BPF_EXIT_INSN(),
  47. BPF_EXIT_INSN(),
  48. },
  49. .result = ACCEPT,
  50. .retval = 7,
  51. },
  52. {
  53. "dead code: end 2",
  54. .insns = {
  55. BPF_MOV64_IMM(BPF_REG_0, 7),
  56. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
  57. BPF_EXIT_INSN(),
  58. BPF_MOV64_IMM(BPF_REG_0, 12),
  59. BPF_EXIT_INSN(),
  60. },
  61. .result = ACCEPT,
  62. .retval = 7,
  63. },
  64. {
  65. "dead code: end 3",
  66. .insns = {
  67. BPF_MOV64_IMM(BPF_REG_0, 7),
  68. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
  69. BPF_EXIT_INSN(),
  70. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
  71. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  72. BPF_MOV64_IMM(BPF_REG_0, 12),
  73. BPF_JMP_IMM(BPF_JA, 0, 0, -5),
  74. },
  75. .result = ACCEPT,
  76. .retval = 7,
  77. },
  78. {
  79. "dead code: tail of main + func",
  80. .insns = {
  81. BPF_MOV64_IMM(BPF_REG_0, 7),
  82. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
  83. BPF_EXIT_INSN(),
  84. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
  85. BPF_EXIT_INSN(),
  86. BPF_MOV64_IMM(BPF_REG_0, 12),
  87. BPF_EXIT_INSN(),
  88. },
  89. .errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
  90. .result_unpriv = REJECT,
  91. .result = ACCEPT,
  92. .retval = 7,
  93. },
  94. {
  95. "dead code: tail of main + two functions",
  96. .insns = {
  97. BPF_MOV64_IMM(BPF_REG_0, 7),
  98. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
  99. BPF_EXIT_INSN(),
  100. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
  101. BPF_EXIT_INSN(),
  102. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
  103. BPF_EXIT_INSN(),
  104. BPF_MOV64_IMM(BPF_REG_0, 12),
  105. BPF_EXIT_INSN(),
  106. },
  107. .errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
  108. .result_unpriv = REJECT,
  109. .result = ACCEPT,
  110. .retval = 7,
  111. },
  112. {
  113. "dead code: function in the middle and mid of another func",
  114. .insns = {
  115. BPF_MOV64_IMM(BPF_REG_1, 7),
  116. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
  117. BPF_EXIT_INSN(),
  118. BPF_MOV64_IMM(BPF_REG_0, 12),
  119. BPF_EXIT_INSN(),
  120. BPF_MOV64_IMM(BPF_REG_0, 7),
  121. BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 7, 1),
  122. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -5),
  123. BPF_EXIT_INSN(),
  124. },
  125. .errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
  126. .result_unpriv = REJECT,
  127. .result = ACCEPT,
  128. .retval = 7,
  129. },
  130. {
  131. "dead code: middle of main before call",
  132. .insns = {
  133. BPF_MOV64_IMM(BPF_REG_1, 2),
  134. BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 2, 1),
  135. BPF_MOV64_IMM(BPF_REG_1, 5),
  136. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
  137. BPF_EXIT_INSN(),
  138. BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
  139. BPF_EXIT_INSN(),
  140. },
  141. .errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
  142. .result_unpriv = REJECT,
  143. .result = ACCEPT,
  144. .retval = 2,
  145. },
  146. {
  147. "dead code: start of a function",
  148. .insns = {
  149. BPF_MOV64_IMM(BPF_REG_1, 2),
  150. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
  151. BPF_EXIT_INSN(),
  152. BPF_JMP_IMM(BPF_JA, 0, 0, 0),
  153. BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
  154. BPF_EXIT_INSN(),
  155. },
  156. .errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
  157. .result_unpriv = REJECT,
  158. .result = ACCEPT,
  159. .retval = 2,
  160. },
  161. {
  162. "dead code: zero extension",
  163. .insns = {
  164. BPF_MOV64_IMM(BPF_REG_0, 0),
  165. BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4),
  166. BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
  167. BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
  168. BPF_EXIT_INSN(),
  169. },
  170. .result = ACCEPT,
  171. .retval = 0,
  172. },