root/tools/testing/selftests/bpf/verifier/stack_ptr.c

/* [<][>][^][v][top][bottom][index][help] */
   1 {
   2         "PTR_TO_STACK store/load",
   3         .insns = {
   4         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
   5         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
   6         BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
   7         BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
   8         BPF_EXIT_INSN(),
   9         },
  10         .result = ACCEPT,
  11         .retval = 0xfaceb00c,
  12 },
  13 {
  14         "PTR_TO_STACK store/load - bad alignment on off",
  15         .insns = {
  16         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  17         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
  18         BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c),
  19         BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2),
  20         BPF_EXIT_INSN(),
  21         },
  22         .result = REJECT,
  23         .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8",
  24 },
  25 {
  26         "PTR_TO_STACK store/load - bad alignment on reg",
  27         .insns = {
  28         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  29         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10),
  30         BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
  31         BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
  32         BPF_EXIT_INSN(),
  33         },
  34         .result = REJECT,
  35         .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8",
  36 },
  37 {
  38         "PTR_TO_STACK store/load - out of bounds low",
  39         .insns = {
  40         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  41         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000),
  42         BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
  43         BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
  44         BPF_EXIT_INSN(),
  45         },
  46         .result = REJECT,
  47         .errstr = "invalid stack off=-79992 size=8",
  48         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
  49 },
  50 {
  51         "PTR_TO_STACK store/load - out of bounds high",
  52         .insns = {
  53         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  54         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
  55         BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c),
  56         BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
  57         BPF_EXIT_INSN(),
  58         },
  59         .result = REJECT,
  60         .errstr = "invalid stack off=0 size=8",
  61 },
  62 {
  63         "PTR_TO_STACK check high 1",
  64         .insns = {
  65         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  66         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1),
  67         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
  68         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
  69         BPF_EXIT_INSN(),
  70         },
  71         .result = ACCEPT,
  72         .retval = 42,
  73 },
  74 {
  75         "PTR_TO_STACK check high 2",
  76         .insns = {
  77         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  78         BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42),
  79         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1),
  80         BPF_EXIT_INSN(),
  81         },
  82         .result = ACCEPT,
  83         .retval = 42,
  84 },
  85 {
  86         "PTR_TO_STACK check high 3",
  87         .insns = {
  88         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
  89         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0),
  90         BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42),
  91         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1),
  92         BPF_EXIT_INSN(),
  93         },
  94         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
  95         .result_unpriv = REJECT,
  96         .result = ACCEPT,
  97         .retval = 42,
  98 },
  99 {
 100         "PTR_TO_STACK check high 4",
 101         .insns = {
 102         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 103         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0),
 104         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 105         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 106         BPF_EXIT_INSN(),
 107         },
 108         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 109         .errstr = "invalid stack off=0 size=1",
 110         .result = REJECT,
 111 },
 112 {
 113         "PTR_TO_STACK check high 5",
 114         .insns = {
 115         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 116         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1),
 117         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 118         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 119         BPF_EXIT_INSN(),
 120         },
 121         .result = REJECT,
 122         .errstr = "invalid stack off",
 123 },
 124 {
 125         "PTR_TO_STACK check high 6",
 126         .insns = {
 127         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 128         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1),
 129         BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42),
 130         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX),
 131         BPF_EXIT_INSN(),
 132         },
 133         .result = REJECT,
 134         .errstr = "invalid stack off",
 135 },
 136 {
 137         "PTR_TO_STACK check high 7",
 138         .insns = {
 139         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 140         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1),
 141         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1),
 142         BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42),
 143         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX),
 144         BPF_EXIT_INSN(),
 145         },
 146         .result = REJECT,
 147         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 148         .errstr = "fp pointer offset",
 149 },
 150 {
 151         "PTR_TO_STACK check low 1",
 152         .insns = {
 153         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 154         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -512),
 155         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 156         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 157         BPF_EXIT_INSN(),
 158         },
 159         .result = ACCEPT,
 160         .retval = 42,
 161 },
 162 {
 163         "PTR_TO_STACK check low 2",
 164         .insns = {
 165         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 166         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513),
 167         BPF_ST_MEM(BPF_B, BPF_REG_1, 1, 42),
 168         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1),
 169         BPF_EXIT_INSN(),
 170         },
 171         .result_unpriv = REJECT,
 172         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 173         .result = ACCEPT,
 174         .retval = 42,
 175 },
 176 {
 177         "PTR_TO_STACK check low 3",
 178         .insns = {
 179         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 180         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513),
 181         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 182         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 183         BPF_EXIT_INSN(),
 184         },
 185         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 186         .errstr = "invalid stack off=-513 size=1",
 187         .result = REJECT,
 188 },
 189 {
 190         "PTR_TO_STACK check low 4",
 191         .insns = {
 192         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 193         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, INT_MIN),
 194         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 195         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 196         BPF_EXIT_INSN(),
 197         },
 198         .result = REJECT,
 199         .errstr = "math between fp pointer",
 200 },
 201 {
 202         "PTR_TO_STACK check low 5",
 203         .insns = {
 204         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 205         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)),
 206         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 207         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 208         BPF_EXIT_INSN(),
 209         },
 210         .result = REJECT,
 211         .errstr = "invalid stack off",
 212 },
 213 {
 214         "PTR_TO_STACK check low 6",
 215         .insns = {
 216         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 217         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)),
 218         BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42),
 219         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN),
 220         BPF_EXIT_INSN(),
 221         },
 222         .result = REJECT,
 223         .errstr = "invalid stack off",
 224 },
 225 {
 226         "PTR_TO_STACK check low 7",
 227         .insns = {
 228         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 229         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)),
 230         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)),
 231         BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42),
 232         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN),
 233         BPF_EXIT_INSN(),
 234         },
 235         .result = REJECT,
 236         .errstr_unpriv = "R1 stack pointer arithmetic goes out of range",
 237         .errstr = "fp pointer offset",
 238 },
 239 {
 240         "PTR_TO_STACK mixed reg/k, 1",
 241         .insns = {
 242         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 243         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3),
 244         BPF_MOV64_IMM(BPF_REG_2, -3),
 245         BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
 246         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 247         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 248         BPF_EXIT_INSN(),
 249         },
 250         .result = ACCEPT,
 251         .retval = 42,
 252 },
 253 {
 254         "PTR_TO_STACK mixed reg/k, 2",
 255         .insns = {
 256         BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
 257         BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
 258         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 259         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3),
 260         BPF_MOV64_IMM(BPF_REG_2, -3),
 261         BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
 262         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 263         BPF_MOV64_REG(BPF_REG_5, BPF_REG_10),
 264         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_5, -6),
 265         BPF_EXIT_INSN(),
 266         },
 267         .result = ACCEPT,
 268         .retval = 42,
 269 },
 270 {
 271         "PTR_TO_STACK mixed reg/k, 3",
 272         .insns = {
 273         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 274         BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3),
 275         BPF_MOV64_IMM(BPF_REG_2, -3),
 276         BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
 277         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 278         BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
 279         BPF_EXIT_INSN(),
 280         },
 281         .result = ACCEPT,
 282         .retval = -3,
 283 },
 284 {
 285         "PTR_TO_STACK reg",
 286         .insns = {
 287         BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
 288         BPF_MOV64_IMM(BPF_REG_2, -3),
 289         BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
 290         BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42),
 291         BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
 292         BPF_EXIT_INSN(),
 293         },
 294         .result_unpriv = REJECT,
 295         .errstr_unpriv = "invalid stack off=0 size=1",
 296         .result = ACCEPT,
 297         .retval = 42,
 298 },
 299 {
 300         "stack pointer arithmetic",
 301         .insns = {
 302         BPF_MOV64_IMM(BPF_REG_1, 4),
 303         BPF_JMP_IMM(BPF_JA, 0, 0, 0),
 304         BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
 305         BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
 306         BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10),
 307         BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
 308         BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1),
 309         BPF_ST_MEM(0, BPF_REG_2, 4, 0),
 310         BPF_MOV64_REG(BPF_REG_2, BPF_REG_7),
 311         BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
 312         BPF_ST_MEM(0, BPF_REG_2, 4, 0),
 313         BPF_MOV64_IMM(BPF_REG_0, 0),
 314         BPF_EXIT_INSN(),
 315         },
 316         .result = ACCEPT,
 317 },

/* [<][>][^][v][top][bottom][index][help] */