1 /* 2 * Testsuite for eBPF verifier 3 * 4 * Copyright (c) 2014 PLUMgrid, http://plumgrid.com 5 * Copyright (c) 2017 Facebook 6 * Copyright (c) 2018 Covalent IO, Inc. http://covalent.io 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of version 2 of the GNU General Public 10 * License as published by the Free Software Foundation. 11 */ 12 13 #include <endian.h> 14 #include <asm/types.h> 15 #include <linux/types.h> 16 #include <stdint.h> 17 #include <stdio.h> 18 #include <stdlib.h> 19 #include <unistd.h> 20 #include <errno.h> 21 #include <string.h> 22 #include <stddef.h> 23 #include <stdbool.h> 24 #include <sched.h> 25 #include <limits.h> 26 #include <assert.h> 27 28 #include <sys/capability.h> 29 30 #include <linux/unistd.h> 31 #include <linux/filter.h> 32 #include <linux/bpf_perf_event.h> 33 #include <linux/bpf.h> 34 #include <linux/if_ether.h> 35 36 #include <bpf/bpf.h> 37 38 #ifdef HAVE_GENHDR 39 # include "autoconf.h" 40 #else 41 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__) 42 # define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1 43 # endif 44 #endif 45 #include "bpf_rlimit.h" 46 #include "bpf_rand.h" 47 #include "bpf_util.h" 48 #include "../../../include/linux/filter.h" 49 50 #define MAX_INSNS BPF_MAXINSNS 51 #define MAX_FIXUPS 8 52 #define MAX_NR_MAPS 13 53 #define MAX_TEST_RUNS 8 54 #define POINTER_VALUE 0xcafe4all 55 #define TEST_DATA_LEN 64 56 57 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) 58 #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) 59 60 #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" 61 static bool unpriv_disabled = false; 62 63 struct bpf_test { 64 const char *descr; 65 struct bpf_insn insns[MAX_INSNS]; 66 int fixup_map_hash_8b[MAX_FIXUPS]; 67 int fixup_map_hash_48b[MAX_FIXUPS]; 68 int fixup_map_hash_16b[MAX_FIXUPS]; 69 int fixup_map_array_48b[MAX_FIXUPS]; 70 int fixup_map_sockmap[MAX_FIXUPS]; 71 int fixup_map_sockhash[MAX_FIXUPS]; 72 int fixup_map_xskmap[MAX_FIXUPS]; 73 int fixup_map_stacktrace[MAX_FIXUPS]; 74 int fixup_prog1[MAX_FIXUPS]; 75 int fixup_prog2[MAX_FIXUPS]; 76 int fixup_map_in_map[MAX_FIXUPS]; 77 int fixup_cgroup_storage[MAX_FIXUPS]; 78 int fixup_percpu_cgroup_storage[MAX_FIXUPS]; 79 const char *errstr; 80 const char *errstr_unpriv; 81 uint32_t retval, retval_unpriv, insn_processed; 82 enum { 83 UNDEF, 84 ACCEPT, 85 REJECT 86 } result, result_unpriv; 87 enum bpf_prog_type prog_type; 88 uint8_t flags; 89 __u8 data[TEST_DATA_LEN]; 90 void (*fill_helper)(struct bpf_test *self); 91 uint8_t runs; 92 struct { 93 uint32_t retval, retval_unpriv; 94 union { 95 __u8 data[TEST_DATA_LEN]; 96 __u64 data64[TEST_DATA_LEN / 8]; 97 }; 98 } retvals[MAX_TEST_RUNS]; 99 }; 100 101 /* Note we want this to be 64 bit aligned so that the end of our array is 102 * actually the end of the structure. 103 */ 104 #define MAX_ENTRIES 11 105 106 struct test_val { 107 unsigned int index; 108 int foo[MAX_ENTRIES]; 109 }; 110 111 struct other_val { 112 long long foo; 113 long long bar; 114 }; 115 116 static void bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self) 117 { 118 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */ 119 #define PUSH_CNT 51 120 unsigned int len = BPF_MAXINSNS; 121 struct bpf_insn *insn = self->insns; 122 int i = 0, j, k = 0; 123 124 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 125 loop: 126 for (j = 0; j < PUSH_CNT; j++) { 127 insn[i++] = BPF_LD_ABS(BPF_B, 0); 128 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 129 i++; 130 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 131 insn[i++] = BPF_MOV64_IMM(BPF_REG_2, 1); 132 insn[i++] = BPF_MOV64_IMM(BPF_REG_3, 2); 133 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 134 BPF_FUNC_skb_vlan_push), 135 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 136 i++; 137 } 138 139 for (j = 0; j < PUSH_CNT; j++) { 140 insn[i++] = BPF_LD_ABS(BPF_B, 0); 141 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 142 i++; 143 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 144 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 145 BPF_FUNC_skb_vlan_pop), 146 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 147 i++; 148 } 149 if (++k < 5) 150 goto loop; 151 152 for (; i < len - 1; i++) 153 insn[i] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 0xbef); 154 insn[len - 1] = BPF_EXIT_INSN(); 155 } 156 157 static void bpf_fill_jump_around_ld_abs(struct bpf_test *self) 158 { 159 struct bpf_insn *insn = self->insns; 160 unsigned int len = BPF_MAXINSNS; 161 int i = 0; 162 163 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 164 insn[i++] = BPF_LD_ABS(BPF_B, 0); 165 insn[i] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 10, len - i - 2); 166 i++; 167 while (i < len - 1) 168 insn[i++] = BPF_LD_ABS(BPF_B, 1); 169 insn[i] = BPF_EXIT_INSN(); 170 } 171 172 static void bpf_fill_rand_ld_dw(struct bpf_test *self) 173 { 174 struct bpf_insn *insn = self->insns; 175 uint64_t res = 0; 176 int i = 0; 177 178 insn[i++] = BPF_MOV32_IMM(BPF_REG_0, 0); 179 while (i < self->retval) { 180 uint64_t val = bpf_semi_rand_get(); 181 struct bpf_insn tmp[2] = { BPF_LD_IMM64(BPF_REG_1, val) }; 182 183 res ^= val; 184 insn[i++] = tmp[0]; 185 insn[i++] = tmp[1]; 186 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 187 } 188 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_0); 189 insn[i++] = BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32); 190 insn[i++] = BPF_ALU64_REG(BPF_XOR, BPF_REG_0, BPF_REG_1); 191 insn[i] = BPF_EXIT_INSN(); 192 res ^= (res >> 32); 193 self->retval = (uint32_t)res; 194 } 195 196 /* BPF_SK_LOOKUP contains 13 instructions, if you need to fix up maps */ 197 #define BPF_SK_LOOKUP \ 198 /* struct bpf_sock_tuple tuple = {} */ \ 199 BPF_MOV64_IMM(BPF_REG_2, 0), \ 200 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_2, -8), \ 201 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -16), \ 202 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -24), \ 203 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -32), \ 204 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -40), \ 205 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -48), \ 206 /* sk = sk_lookup_tcp(ctx, &tuple, sizeof tuple, 0, 0) */ \ 207 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), \ 208 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), \ 209 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), \ 210 BPF_MOV64_IMM(BPF_REG_4, 0), \ 211 BPF_MOV64_IMM(BPF_REG_5, 0), \ 212 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp) 213 214 static struct bpf_test tests[] = { 215 { 216 "add+sub+mul", 217 .insns = { 218 BPF_MOV64_IMM(BPF_REG_1, 1), 219 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 220 BPF_MOV64_IMM(BPF_REG_2, 3), 221 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 222 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 223 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 224 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 225 BPF_EXIT_INSN(), 226 }, 227 .result = ACCEPT, 228 .retval = -3, 229 }, 230 { 231 "DIV32 by 0, zero check 1", 232 .insns = { 233 BPF_MOV32_IMM(BPF_REG_0, 42), 234 BPF_MOV32_IMM(BPF_REG_1, 0), 235 BPF_MOV32_IMM(BPF_REG_2, 1), 236 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 237 BPF_EXIT_INSN(), 238 }, 239 .result = ACCEPT, 240 .retval = 42, 241 }, 242 { 243 "DIV32 by 0, zero check 2", 244 .insns = { 245 BPF_MOV32_IMM(BPF_REG_0, 42), 246 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 247 BPF_MOV32_IMM(BPF_REG_2, 1), 248 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 249 BPF_EXIT_INSN(), 250 }, 251 .result = ACCEPT, 252 .retval = 42, 253 }, 254 { 255 "DIV64 by 0, zero check", 256 .insns = { 257 BPF_MOV32_IMM(BPF_REG_0, 42), 258 BPF_MOV32_IMM(BPF_REG_1, 0), 259 BPF_MOV32_IMM(BPF_REG_2, 1), 260 BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 261 BPF_EXIT_INSN(), 262 }, 263 .result = ACCEPT, 264 .retval = 42, 265 }, 266 { 267 "MOD32 by 0, zero check 1", 268 .insns = { 269 BPF_MOV32_IMM(BPF_REG_0, 42), 270 BPF_MOV32_IMM(BPF_REG_1, 0), 271 BPF_MOV32_IMM(BPF_REG_2, 1), 272 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 273 BPF_EXIT_INSN(), 274 }, 275 .result = ACCEPT, 276 .retval = 42, 277 }, 278 { 279 "MOD32 by 0, zero check 2", 280 .insns = { 281 BPF_MOV32_IMM(BPF_REG_0, 42), 282 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 283 BPF_MOV32_IMM(BPF_REG_2, 1), 284 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 285 BPF_EXIT_INSN(), 286 }, 287 .result = ACCEPT, 288 .retval = 42, 289 }, 290 { 291 "MOD64 by 0, zero check", 292 .insns = { 293 BPF_MOV32_IMM(BPF_REG_0, 42), 294 BPF_MOV32_IMM(BPF_REG_1, 0), 295 BPF_MOV32_IMM(BPF_REG_2, 1), 296 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 297 BPF_EXIT_INSN(), 298 }, 299 .result = ACCEPT, 300 .retval = 42, 301 }, 302 { 303 "DIV32 by 0, zero check ok, cls", 304 .insns = { 305 BPF_MOV32_IMM(BPF_REG_0, 42), 306 BPF_MOV32_IMM(BPF_REG_1, 2), 307 BPF_MOV32_IMM(BPF_REG_2, 16), 308 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 309 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 310 BPF_EXIT_INSN(), 311 }, 312 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 313 .result = ACCEPT, 314 .retval = 8, 315 }, 316 { 317 "DIV32 by 0, zero check 1, cls", 318 .insns = { 319 BPF_MOV32_IMM(BPF_REG_1, 0), 320 BPF_MOV32_IMM(BPF_REG_0, 1), 321 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 322 BPF_EXIT_INSN(), 323 }, 324 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 325 .result = ACCEPT, 326 .retval = 0, 327 }, 328 { 329 "DIV32 by 0, zero check 2, cls", 330 .insns = { 331 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 332 BPF_MOV32_IMM(BPF_REG_0, 1), 333 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 334 BPF_EXIT_INSN(), 335 }, 336 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 337 .result = ACCEPT, 338 .retval = 0, 339 }, 340 { 341 "DIV64 by 0, zero check, cls", 342 .insns = { 343 BPF_MOV32_IMM(BPF_REG_1, 0), 344 BPF_MOV32_IMM(BPF_REG_0, 1), 345 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 346 BPF_EXIT_INSN(), 347 }, 348 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 349 .result = ACCEPT, 350 .retval = 0, 351 }, 352 { 353 "MOD32 by 0, zero check ok, cls", 354 .insns = { 355 BPF_MOV32_IMM(BPF_REG_0, 42), 356 BPF_MOV32_IMM(BPF_REG_1, 3), 357 BPF_MOV32_IMM(BPF_REG_2, 5), 358 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 359 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 360 BPF_EXIT_INSN(), 361 }, 362 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 363 .result = ACCEPT, 364 .retval = 2, 365 }, 366 { 367 "MOD32 by 0, zero check 1, cls", 368 .insns = { 369 BPF_MOV32_IMM(BPF_REG_1, 0), 370 BPF_MOV32_IMM(BPF_REG_0, 1), 371 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 372 BPF_EXIT_INSN(), 373 }, 374 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 375 .result = ACCEPT, 376 .retval = 1, 377 }, 378 { 379 "MOD32 by 0, zero check 2, cls", 380 .insns = { 381 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 382 BPF_MOV32_IMM(BPF_REG_0, 1), 383 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 384 BPF_EXIT_INSN(), 385 }, 386 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 387 .result = ACCEPT, 388 .retval = 1, 389 }, 390 { 391 "MOD64 by 0, zero check 1, cls", 392 .insns = { 393 BPF_MOV32_IMM(BPF_REG_1, 0), 394 BPF_MOV32_IMM(BPF_REG_0, 2), 395 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 396 BPF_EXIT_INSN(), 397 }, 398 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 399 .result = ACCEPT, 400 .retval = 2, 401 }, 402 { 403 "MOD64 by 0, zero check 2, cls", 404 .insns = { 405 BPF_MOV32_IMM(BPF_REG_1, 0), 406 BPF_MOV32_IMM(BPF_REG_0, -1), 407 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 408 BPF_EXIT_INSN(), 409 }, 410 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 411 .result = ACCEPT, 412 .retval = -1, 413 }, 414 /* Just make sure that JITs used udiv/umod as otherwise we get 415 * an exception from INT_MIN/-1 overflow similarly as with div 416 * by zero. 417 */ 418 { 419 "DIV32 overflow, check 1", 420 .insns = { 421 BPF_MOV32_IMM(BPF_REG_1, -1), 422 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 423 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 424 BPF_EXIT_INSN(), 425 }, 426 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 427 .result = ACCEPT, 428 .retval = 0, 429 }, 430 { 431 "DIV32 overflow, check 2", 432 .insns = { 433 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 434 BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1), 435 BPF_EXIT_INSN(), 436 }, 437 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 438 .result = ACCEPT, 439 .retval = 0, 440 }, 441 { 442 "DIV64 overflow, check 1", 443 .insns = { 444 BPF_MOV64_IMM(BPF_REG_1, -1), 445 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 446 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 447 BPF_EXIT_INSN(), 448 }, 449 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 450 .result = ACCEPT, 451 .retval = 0, 452 }, 453 { 454 "DIV64 overflow, check 2", 455 .insns = { 456 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 457 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, -1), 458 BPF_EXIT_INSN(), 459 }, 460 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 461 .result = ACCEPT, 462 .retval = 0, 463 }, 464 { 465 "MOD32 overflow, check 1", 466 .insns = { 467 BPF_MOV32_IMM(BPF_REG_1, -1), 468 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 469 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 470 BPF_EXIT_INSN(), 471 }, 472 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 473 .result = ACCEPT, 474 .retval = INT_MIN, 475 }, 476 { 477 "MOD32 overflow, check 2", 478 .insns = { 479 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 480 BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1), 481 BPF_EXIT_INSN(), 482 }, 483 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 484 .result = ACCEPT, 485 .retval = INT_MIN, 486 }, 487 { 488 "MOD64 overflow, check 1", 489 .insns = { 490 BPF_MOV64_IMM(BPF_REG_1, -1), 491 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 492 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 493 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 494 BPF_MOV32_IMM(BPF_REG_0, 0), 495 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 496 BPF_MOV32_IMM(BPF_REG_0, 1), 497 BPF_EXIT_INSN(), 498 }, 499 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 500 .result = ACCEPT, 501 .retval = 1, 502 }, 503 { 504 "MOD64 overflow, check 2", 505 .insns = { 506 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 507 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 508 BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1), 509 BPF_MOV32_IMM(BPF_REG_0, 0), 510 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 511 BPF_MOV32_IMM(BPF_REG_0, 1), 512 BPF_EXIT_INSN(), 513 }, 514 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 515 .result = ACCEPT, 516 .retval = 1, 517 }, 518 { 519 "xor32 zero extend check", 520 .insns = { 521 BPF_MOV32_IMM(BPF_REG_2, -1), 522 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 523 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 524 BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 525 BPF_MOV32_IMM(BPF_REG_0, 2), 526 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 527 BPF_MOV32_IMM(BPF_REG_0, 1), 528 BPF_EXIT_INSN(), 529 }, 530 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 531 .result = ACCEPT, 532 .retval = 1, 533 }, 534 { 535 "empty prog", 536 .insns = { 537 }, 538 .errstr = "unknown opcode 00", 539 .result = REJECT, 540 }, 541 { 542 "only exit insn", 543 .insns = { 544 BPF_EXIT_INSN(), 545 }, 546 .errstr = "R0 !read_ok", 547 .result = REJECT, 548 }, 549 { 550 "unreachable", 551 .insns = { 552 BPF_EXIT_INSN(), 553 BPF_EXIT_INSN(), 554 }, 555 .errstr = "unreachable", 556 .result = REJECT, 557 }, 558 { 559 "unreachable2", 560 .insns = { 561 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 562 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 563 BPF_EXIT_INSN(), 564 }, 565 .errstr = "unreachable", 566 .result = REJECT, 567 }, 568 { 569 "out of range jump", 570 .insns = { 571 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 572 BPF_EXIT_INSN(), 573 }, 574 .errstr = "jump out of range", 575 .result = REJECT, 576 }, 577 { 578 "out of range jump2", 579 .insns = { 580 BPF_JMP_IMM(BPF_JA, 0, 0, -2), 581 BPF_EXIT_INSN(), 582 }, 583 .errstr = "jump out of range", 584 .result = REJECT, 585 }, 586 { 587 "test1 ld_imm64", 588 .insns = { 589 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 590 BPF_LD_IMM64(BPF_REG_0, 0), 591 BPF_LD_IMM64(BPF_REG_0, 0), 592 BPF_LD_IMM64(BPF_REG_0, 1), 593 BPF_LD_IMM64(BPF_REG_0, 1), 594 BPF_MOV64_IMM(BPF_REG_0, 2), 595 BPF_EXIT_INSN(), 596 }, 597 .errstr = "invalid BPF_LD_IMM insn", 598 .errstr_unpriv = "R1 pointer comparison", 599 .result = REJECT, 600 }, 601 { 602 "test2 ld_imm64", 603 .insns = { 604 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 605 BPF_LD_IMM64(BPF_REG_0, 0), 606 BPF_LD_IMM64(BPF_REG_0, 0), 607 BPF_LD_IMM64(BPF_REG_0, 1), 608 BPF_LD_IMM64(BPF_REG_0, 1), 609 BPF_EXIT_INSN(), 610 }, 611 .errstr = "invalid BPF_LD_IMM insn", 612 .errstr_unpriv = "R1 pointer comparison", 613 .result = REJECT, 614 }, 615 { 616 "test3 ld_imm64", 617 .insns = { 618 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 619 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 620 BPF_LD_IMM64(BPF_REG_0, 0), 621 BPF_LD_IMM64(BPF_REG_0, 0), 622 BPF_LD_IMM64(BPF_REG_0, 1), 623 BPF_LD_IMM64(BPF_REG_0, 1), 624 BPF_EXIT_INSN(), 625 }, 626 .errstr = "invalid bpf_ld_imm64 insn", 627 .result = REJECT, 628 }, 629 { 630 "test4 ld_imm64", 631 .insns = { 632 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 633 BPF_EXIT_INSN(), 634 }, 635 .errstr = "invalid bpf_ld_imm64 insn", 636 .result = REJECT, 637 }, 638 { 639 "test5 ld_imm64", 640 .insns = { 641 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 642 }, 643 .errstr = "invalid bpf_ld_imm64 insn", 644 .result = REJECT, 645 }, 646 { 647 "test6 ld_imm64", 648 .insns = { 649 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 650 BPF_RAW_INSN(0, 0, 0, 0, 0), 651 BPF_EXIT_INSN(), 652 }, 653 .result = ACCEPT, 654 }, 655 { 656 "test7 ld_imm64", 657 .insns = { 658 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 659 BPF_RAW_INSN(0, 0, 0, 0, 1), 660 BPF_EXIT_INSN(), 661 }, 662 .result = ACCEPT, 663 .retval = 1, 664 }, 665 { 666 "test8 ld_imm64", 667 .insns = { 668 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1), 669 BPF_RAW_INSN(0, 0, 0, 0, 1), 670 BPF_EXIT_INSN(), 671 }, 672 .errstr = "uses reserved fields", 673 .result = REJECT, 674 }, 675 { 676 "test9 ld_imm64", 677 .insns = { 678 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 679 BPF_RAW_INSN(0, 0, 0, 1, 1), 680 BPF_EXIT_INSN(), 681 }, 682 .errstr = "invalid bpf_ld_imm64 insn", 683 .result = REJECT, 684 }, 685 { 686 "test10 ld_imm64", 687 .insns = { 688 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 689 BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1), 690 BPF_EXIT_INSN(), 691 }, 692 .errstr = "invalid bpf_ld_imm64 insn", 693 .result = REJECT, 694 }, 695 { 696 "test11 ld_imm64", 697 .insns = { 698 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 699 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 700 BPF_EXIT_INSN(), 701 }, 702 .errstr = "invalid bpf_ld_imm64 insn", 703 .result = REJECT, 704 }, 705 { 706 "test12 ld_imm64", 707 .insns = { 708 BPF_MOV64_IMM(BPF_REG_1, 0), 709 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 710 BPF_RAW_INSN(0, 0, 0, 0, 1), 711 BPF_EXIT_INSN(), 712 }, 713 .errstr = "not pointing to valid bpf_map", 714 .result = REJECT, 715 }, 716 { 717 "test13 ld_imm64", 718 .insns = { 719 BPF_MOV64_IMM(BPF_REG_1, 0), 720 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 721 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 722 BPF_EXIT_INSN(), 723 }, 724 .errstr = "invalid bpf_ld_imm64 insn", 725 .result = REJECT, 726 }, 727 { 728 "arsh32 on imm", 729 .insns = { 730 BPF_MOV64_IMM(BPF_REG_0, 1), 731 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 732 BPF_EXIT_INSN(), 733 }, 734 .result = ACCEPT, 735 .retval = 0, 736 }, 737 { 738 "arsh32 on imm 2", 739 .insns = { 740 BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 741 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 742 BPF_EXIT_INSN(), 743 }, 744 .result = ACCEPT, 745 .retval = -16069393, 746 }, 747 { 748 "arsh32 on reg", 749 .insns = { 750 BPF_MOV64_IMM(BPF_REG_0, 1), 751 BPF_MOV64_IMM(BPF_REG_1, 5), 752 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 753 BPF_EXIT_INSN(), 754 }, 755 .result = ACCEPT, 756 .retval = 0, 757 }, 758 { 759 "arsh32 on reg 2", 760 .insns = { 761 BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 762 BPF_MOV64_IMM(BPF_REG_1, 15), 763 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 764 BPF_EXIT_INSN(), 765 }, 766 .result = ACCEPT, 767 .retval = 43724, 768 }, 769 { 770 "arsh64 on imm", 771 .insns = { 772 BPF_MOV64_IMM(BPF_REG_0, 1), 773 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 774 BPF_EXIT_INSN(), 775 }, 776 .result = ACCEPT, 777 }, 778 { 779 "arsh64 on reg", 780 .insns = { 781 BPF_MOV64_IMM(BPF_REG_0, 1), 782 BPF_MOV64_IMM(BPF_REG_1, 5), 783 BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 784 BPF_EXIT_INSN(), 785 }, 786 .result = ACCEPT, 787 }, 788 { 789 "no bpf_exit", 790 .insns = { 791 BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2), 792 }, 793 .errstr = "not an exit", 794 .result = REJECT, 795 }, 796 { 797 "loop (back-edge)", 798 .insns = { 799 BPF_JMP_IMM(BPF_JA, 0, 0, -1), 800 BPF_EXIT_INSN(), 801 }, 802 .errstr = "back-edge", 803 .result = REJECT, 804 }, 805 { 806 "loop2 (back-edge)", 807 .insns = { 808 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 809 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 810 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 811 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 812 BPF_EXIT_INSN(), 813 }, 814 .errstr = "back-edge", 815 .result = REJECT, 816 }, 817 { 818 "conditional loop", 819 .insns = { 820 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 821 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 822 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 823 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 824 BPF_EXIT_INSN(), 825 }, 826 .errstr = "back-edge", 827 .result = REJECT, 828 }, 829 { 830 "read uninitialized register", 831 .insns = { 832 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 833 BPF_EXIT_INSN(), 834 }, 835 .errstr = "R2 !read_ok", 836 .result = REJECT, 837 }, 838 { 839 "read invalid register", 840 .insns = { 841 BPF_MOV64_REG(BPF_REG_0, -1), 842 BPF_EXIT_INSN(), 843 }, 844 .errstr = "R15 is invalid", 845 .result = REJECT, 846 }, 847 { 848 "program doesn't init R0 before exit", 849 .insns = { 850 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 851 BPF_EXIT_INSN(), 852 }, 853 .errstr = "R0 !read_ok", 854 .result = REJECT, 855 }, 856 { 857 "program doesn't init R0 before exit in all branches", 858 .insns = { 859 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 860 BPF_MOV64_IMM(BPF_REG_0, 1), 861 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 862 BPF_EXIT_INSN(), 863 }, 864 .errstr = "R0 !read_ok", 865 .errstr_unpriv = "R1 pointer comparison", 866 .result = REJECT, 867 }, 868 { 869 "stack out of bounds", 870 .insns = { 871 BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0), 872 BPF_EXIT_INSN(), 873 }, 874 .errstr = "invalid stack", 875 .result = REJECT, 876 }, 877 { 878 "invalid call insn1", 879 .insns = { 880 BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0), 881 BPF_EXIT_INSN(), 882 }, 883 .errstr = "unknown opcode 8d", 884 .result = REJECT, 885 }, 886 { 887 "invalid call insn2", 888 .insns = { 889 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0), 890 BPF_EXIT_INSN(), 891 }, 892 .errstr = "BPF_CALL uses reserved", 893 .result = REJECT, 894 }, 895 { 896 "invalid function call", 897 .insns = { 898 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567), 899 BPF_EXIT_INSN(), 900 }, 901 .errstr = "invalid func unknown#1234567", 902 .result = REJECT, 903 }, 904 { 905 "uninitialized stack1", 906 .insns = { 907 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 908 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 909 BPF_LD_MAP_FD(BPF_REG_1, 0), 910 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 911 BPF_FUNC_map_lookup_elem), 912 BPF_EXIT_INSN(), 913 }, 914 .fixup_map_hash_8b = { 2 }, 915 .errstr = "invalid indirect read from stack", 916 .result = REJECT, 917 }, 918 { 919 "uninitialized stack2", 920 .insns = { 921 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 922 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8), 923 BPF_EXIT_INSN(), 924 }, 925 .errstr = "invalid read from stack", 926 .result = REJECT, 927 }, 928 { 929 "invalid fp arithmetic", 930 /* If this gets ever changed, make sure JITs can deal with it. */ 931 .insns = { 932 BPF_MOV64_IMM(BPF_REG_0, 0), 933 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 934 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8), 935 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 936 BPF_EXIT_INSN(), 937 }, 938 .errstr = "R1 subtraction from stack pointer", 939 .result = REJECT, 940 }, 941 { 942 "non-invalid fp arithmetic", 943 .insns = { 944 BPF_MOV64_IMM(BPF_REG_0, 0), 945 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 946 BPF_EXIT_INSN(), 947 }, 948 .result = ACCEPT, 949 }, 950 { 951 "invalid argument register", 952 .insns = { 953 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 954 BPF_FUNC_get_cgroup_classid), 955 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 956 BPF_FUNC_get_cgroup_classid), 957 BPF_EXIT_INSN(), 958 }, 959 .errstr = "R1 !read_ok", 960 .result = REJECT, 961 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 962 }, 963 { 964 "non-invalid argument register", 965 .insns = { 966 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 967 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 968 BPF_FUNC_get_cgroup_classid), 969 BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6), 970 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 971 BPF_FUNC_get_cgroup_classid), 972 BPF_EXIT_INSN(), 973 }, 974 .result = ACCEPT, 975 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 976 }, 977 { 978 "check valid spill/fill", 979 .insns = { 980 /* spill R1(ctx) into stack */ 981 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 982 /* fill it back into R2 */ 983 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 984 /* should be able to access R0 = *(R2 + 8) */ 985 /* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */ 986 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 987 BPF_EXIT_INSN(), 988 }, 989 .errstr_unpriv = "R0 leaks addr", 990 .result = ACCEPT, 991 .result_unpriv = REJECT, 992 .retval = POINTER_VALUE, 993 }, 994 { 995 "check valid spill/fill, skb mark", 996 .insns = { 997 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 998 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 999 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1000 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 1001 offsetof(struct __sk_buff, mark)), 1002 BPF_EXIT_INSN(), 1003 }, 1004 .result = ACCEPT, 1005 .result_unpriv = ACCEPT, 1006 }, 1007 { 1008 "check corrupted spill/fill", 1009 .insns = { 1010 /* spill R1(ctx) into stack */ 1011 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1012 /* mess up with R1 pointer on stack */ 1013 BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23), 1014 /* fill back into R0 is fine for priv. 1015 * R0 now becomes SCALAR_VALUE. 1016 */ 1017 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1018 /* Load from R0 should fail. */ 1019 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 8), 1020 BPF_EXIT_INSN(), 1021 }, 1022 .errstr_unpriv = "attempt to corrupt spilled", 1023 .errstr = "R0 invalid mem access 'inv", 1024 .result = REJECT, 1025 }, 1026 { 1027 "check corrupted spill/fill, LSB", 1028 .insns = { 1029 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1030 BPF_ST_MEM(BPF_H, BPF_REG_10, -8, 0xcafe), 1031 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1032 BPF_EXIT_INSN(), 1033 }, 1034 .errstr_unpriv = "attempt to corrupt spilled", 1035 .result_unpriv = REJECT, 1036 .result = ACCEPT, 1037 .retval = POINTER_VALUE, 1038 }, 1039 { 1040 "check corrupted spill/fill, MSB", 1041 .insns = { 1042 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 1043 BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 0x12345678), 1044 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 1045 BPF_EXIT_INSN(), 1046 }, 1047 .errstr_unpriv = "attempt to corrupt spilled", 1048 .result_unpriv = REJECT, 1049 .result = ACCEPT, 1050 .retval = POINTER_VALUE, 1051 }, 1052 { 1053 "invalid src register in STX", 1054 .insns = { 1055 BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1), 1056 BPF_EXIT_INSN(), 1057 }, 1058 .errstr = "R15 is invalid", 1059 .result = REJECT, 1060 }, 1061 { 1062 "invalid dst register in STX", 1063 .insns = { 1064 BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1), 1065 BPF_EXIT_INSN(), 1066 }, 1067 .errstr = "R14 is invalid", 1068 .result = REJECT, 1069 }, 1070 { 1071 "invalid dst register in ST", 1072 .insns = { 1073 BPF_ST_MEM(BPF_B, 14, -1, -1), 1074 BPF_EXIT_INSN(), 1075 }, 1076 .errstr = "R14 is invalid", 1077 .result = REJECT, 1078 }, 1079 { 1080 "invalid src register in LDX", 1081 .insns = { 1082 BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0), 1083 BPF_EXIT_INSN(), 1084 }, 1085 .errstr = "R12 is invalid", 1086 .result = REJECT, 1087 }, 1088 { 1089 "invalid dst register in LDX", 1090 .insns = { 1091 BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0), 1092 BPF_EXIT_INSN(), 1093 }, 1094 .errstr = "R11 is invalid", 1095 .result = REJECT, 1096 }, 1097 { 1098 "junk insn", 1099 .insns = { 1100 BPF_RAW_INSN(0, 0, 0, 0, 0), 1101 BPF_EXIT_INSN(), 1102 }, 1103 .errstr = "unknown opcode 00", 1104 .result = REJECT, 1105 }, 1106 { 1107 "junk insn2", 1108 .insns = { 1109 BPF_RAW_INSN(1, 0, 0, 0, 0), 1110 BPF_EXIT_INSN(), 1111 }, 1112 .errstr = "BPF_LDX uses reserved fields", 1113 .result = REJECT, 1114 }, 1115 { 1116 "junk insn3", 1117 .insns = { 1118 BPF_RAW_INSN(-1, 0, 0, 0, 0), 1119 BPF_EXIT_INSN(), 1120 }, 1121 .errstr = "unknown opcode ff", 1122 .result = REJECT, 1123 }, 1124 { 1125 "junk insn4", 1126 .insns = { 1127 BPF_RAW_INSN(-1, -1, -1, -1, -1), 1128 BPF_EXIT_INSN(), 1129 }, 1130 .errstr = "unknown opcode ff", 1131 .result = REJECT, 1132 }, 1133 { 1134 "junk insn5", 1135 .insns = { 1136 BPF_RAW_INSN(0x7f, -1, -1, -1, -1), 1137 BPF_EXIT_INSN(), 1138 }, 1139 .errstr = "BPF_ALU uses reserved fields", 1140 .result = REJECT, 1141 }, 1142 { 1143 "misaligned read from stack", 1144 .insns = { 1145 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1146 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4), 1147 BPF_EXIT_INSN(), 1148 }, 1149 .errstr = "misaligned stack access", 1150 .result = REJECT, 1151 }, 1152 { 1153 "invalid map_fd for function call", 1154 .insns = { 1155 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1156 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10), 1157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1158 BPF_LD_MAP_FD(BPF_REG_1, 0), 1159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1160 BPF_FUNC_map_delete_elem), 1161 BPF_EXIT_INSN(), 1162 }, 1163 .errstr = "fd 0 is not pointing to valid bpf_map", 1164 .result = REJECT, 1165 }, 1166 { 1167 "don't check return value before access", 1168 .insns = { 1169 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1170 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1171 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1172 BPF_LD_MAP_FD(BPF_REG_1, 0), 1173 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1174 BPF_FUNC_map_lookup_elem), 1175 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1176 BPF_EXIT_INSN(), 1177 }, 1178 .fixup_map_hash_8b = { 3 }, 1179 .errstr = "R0 invalid mem access 'map_value_or_null'", 1180 .result = REJECT, 1181 }, 1182 { 1183 "access memory with incorrect alignment", 1184 .insns = { 1185 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1186 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1188 BPF_LD_MAP_FD(BPF_REG_1, 0), 1189 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1190 BPF_FUNC_map_lookup_elem), 1191 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 1192 BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0), 1193 BPF_EXIT_INSN(), 1194 }, 1195 .fixup_map_hash_8b = { 3 }, 1196 .errstr = "misaligned value access", 1197 .result = REJECT, 1198 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1199 }, 1200 { 1201 "sometimes access memory with incorrect alignment", 1202 .insns = { 1203 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1204 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1205 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1206 BPF_LD_MAP_FD(BPF_REG_1, 0), 1207 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1208 BPF_FUNC_map_lookup_elem), 1209 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 1210 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1211 BPF_EXIT_INSN(), 1212 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1), 1213 BPF_EXIT_INSN(), 1214 }, 1215 .fixup_map_hash_8b = { 3 }, 1216 .errstr = "R0 invalid mem access", 1217 .errstr_unpriv = "R0 leaks addr", 1218 .result = REJECT, 1219 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1220 }, 1221 { 1222 "jump test 1", 1223 .insns = { 1224 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1225 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8), 1226 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 1227 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1229 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1), 1230 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1), 1231 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2), 1232 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1), 1233 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3), 1234 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1), 1235 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4), 1236 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1237 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5), 1238 BPF_MOV64_IMM(BPF_REG_0, 0), 1239 BPF_EXIT_INSN(), 1240 }, 1241 .errstr_unpriv = "R1 pointer comparison", 1242 .result_unpriv = REJECT, 1243 .result = ACCEPT, 1244 }, 1245 { 1246 "jump test 2", 1247 .insns = { 1248 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1249 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 1250 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1251 BPF_JMP_IMM(BPF_JA, 0, 0, 14), 1252 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2), 1253 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1254 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1255 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2), 1256 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1257 BPF_JMP_IMM(BPF_JA, 0, 0, 8), 1258 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2), 1259 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1260 BPF_JMP_IMM(BPF_JA, 0, 0, 5), 1261 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2), 1262 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1263 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1264 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1265 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1266 BPF_MOV64_IMM(BPF_REG_0, 0), 1267 BPF_EXIT_INSN(), 1268 }, 1269 .errstr_unpriv = "R1 pointer comparison", 1270 .result_unpriv = REJECT, 1271 .result = ACCEPT, 1272 }, 1273 { 1274 "jump test 3", 1275 .insns = { 1276 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1277 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 1278 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1280 BPF_JMP_IMM(BPF_JA, 0, 0, 19), 1281 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3), 1282 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1283 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 1284 BPF_JMP_IMM(BPF_JA, 0, 0, 15), 1285 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3), 1286 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1287 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32), 1288 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1289 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3), 1290 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1291 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40), 1292 BPF_JMP_IMM(BPF_JA, 0, 0, 7), 1293 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3), 1294 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1295 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), 1296 BPF_JMP_IMM(BPF_JA, 0, 0, 3), 1297 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0), 1298 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1299 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56), 1300 BPF_LD_MAP_FD(BPF_REG_1, 0), 1301 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1302 BPF_FUNC_map_delete_elem), 1303 BPF_EXIT_INSN(), 1304 }, 1305 .fixup_map_hash_8b = { 24 }, 1306 .errstr_unpriv = "R1 pointer comparison", 1307 .result_unpriv = REJECT, 1308 .result = ACCEPT, 1309 .retval = -ENOENT, 1310 }, 1311 { 1312 "jump test 4", 1313 .insns = { 1314 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1315 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1316 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1317 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1318 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1319 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1320 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1321 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1322 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1323 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1324 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1325 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1326 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1327 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1328 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1329 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1330 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1331 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1332 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1333 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1334 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1335 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1336 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1337 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1338 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1339 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1340 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1341 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1342 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1343 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1344 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1345 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1346 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1347 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1348 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1349 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1350 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1351 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1352 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1353 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1354 BPF_MOV64_IMM(BPF_REG_0, 0), 1355 BPF_EXIT_INSN(), 1356 }, 1357 .errstr_unpriv = "R1 pointer comparison", 1358 .result_unpriv = REJECT, 1359 .result = ACCEPT, 1360 }, 1361 { 1362 "jump test 5", 1363 .insns = { 1364 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1365 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 1366 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1367 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1368 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1369 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1370 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1371 BPF_MOV64_IMM(BPF_REG_0, 0), 1372 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1373 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1374 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1375 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1376 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1377 BPF_MOV64_IMM(BPF_REG_0, 0), 1378 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1379 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1380 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1381 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1382 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1383 BPF_MOV64_IMM(BPF_REG_0, 0), 1384 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1385 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1386 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1387 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1388 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1389 BPF_MOV64_IMM(BPF_REG_0, 0), 1390 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1391 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1392 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1393 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1394 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1395 BPF_MOV64_IMM(BPF_REG_0, 0), 1396 BPF_EXIT_INSN(), 1397 }, 1398 .errstr_unpriv = "R1 pointer comparison", 1399 .result_unpriv = REJECT, 1400 .result = ACCEPT, 1401 }, 1402 { 1403 "access skb fields ok", 1404 .insns = { 1405 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1406 offsetof(struct __sk_buff, len)), 1407 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1408 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1409 offsetof(struct __sk_buff, mark)), 1410 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1411 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1412 offsetof(struct __sk_buff, pkt_type)), 1413 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1414 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1415 offsetof(struct __sk_buff, queue_mapping)), 1416 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1417 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1418 offsetof(struct __sk_buff, protocol)), 1419 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1420 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1421 offsetof(struct __sk_buff, vlan_present)), 1422 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1423 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1424 offsetof(struct __sk_buff, vlan_tci)), 1425 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1426 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1427 offsetof(struct __sk_buff, napi_id)), 1428 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1429 BPF_EXIT_INSN(), 1430 }, 1431 .result = ACCEPT, 1432 }, 1433 { 1434 "access skb fields bad1", 1435 .insns = { 1436 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4), 1437 BPF_EXIT_INSN(), 1438 }, 1439 .errstr = "invalid bpf_context access", 1440 .result = REJECT, 1441 }, 1442 { 1443 "access skb fields bad2", 1444 .insns = { 1445 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9), 1446 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1447 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1448 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1449 BPF_LD_MAP_FD(BPF_REG_1, 0), 1450 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1451 BPF_FUNC_map_lookup_elem), 1452 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1453 BPF_EXIT_INSN(), 1454 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1455 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1456 offsetof(struct __sk_buff, pkt_type)), 1457 BPF_EXIT_INSN(), 1458 }, 1459 .fixup_map_hash_8b = { 4 }, 1460 .errstr = "different pointers", 1461 .errstr_unpriv = "R1 pointer comparison", 1462 .result = REJECT, 1463 }, 1464 { 1465 "access skb fields bad3", 1466 .insns = { 1467 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1468 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1469 offsetof(struct __sk_buff, pkt_type)), 1470 BPF_EXIT_INSN(), 1471 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1472 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1474 BPF_LD_MAP_FD(BPF_REG_1, 0), 1475 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1476 BPF_FUNC_map_lookup_elem), 1477 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1478 BPF_EXIT_INSN(), 1479 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1480 BPF_JMP_IMM(BPF_JA, 0, 0, -12), 1481 }, 1482 .fixup_map_hash_8b = { 6 }, 1483 .errstr = "different pointers", 1484 .errstr_unpriv = "R1 pointer comparison", 1485 .result = REJECT, 1486 }, 1487 { 1488 "access skb fields bad4", 1489 .insns = { 1490 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3), 1491 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1492 offsetof(struct __sk_buff, len)), 1493 BPF_MOV64_IMM(BPF_REG_0, 0), 1494 BPF_EXIT_INSN(), 1495 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1496 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1497 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1498 BPF_LD_MAP_FD(BPF_REG_1, 0), 1499 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1500 BPF_FUNC_map_lookup_elem), 1501 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1502 BPF_EXIT_INSN(), 1503 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1504 BPF_JMP_IMM(BPF_JA, 0, 0, -13), 1505 }, 1506 .fixup_map_hash_8b = { 7 }, 1507 .errstr = "different pointers", 1508 .errstr_unpriv = "R1 pointer comparison", 1509 .result = REJECT, 1510 }, 1511 { 1512 "invalid access __sk_buff family", 1513 .insns = { 1514 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1515 offsetof(struct __sk_buff, family)), 1516 BPF_EXIT_INSN(), 1517 }, 1518 .errstr = "invalid bpf_context access", 1519 .result = REJECT, 1520 }, 1521 { 1522 "invalid access __sk_buff remote_ip4", 1523 .insns = { 1524 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1525 offsetof(struct __sk_buff, remote_ip4)), 1526 BPF_EXIT_INSN(), 1527 }, 1528 .errstr = "invalid bpf_context access", 1529 .result = REJECT, 1530 }, 1531 { 1532 "invalid access __sk_buff local_ip4", 1533 .insns = { 1534 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1535 offsetof(struct __sk_buff, local_ip4)), 1536 BPF_EXIT_INSN(), 1537 }, 1538 .errstr = "invalid bpf_context access", 1539 .result = REJECT, 1540 }, 1541 { 1542 "invalid access __sk_buff remote_ip6", 1543 .insns = { 1544 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1545 offsetof(struct __sk_buff, remote_ip6)), 1546 BPF_EXIT_INSN(), 1547 }, 1548 .errstr = "invalid bpf_context access", 1549 .result = REJECT, 1550 }, 1551 { 1552 "invalid access __sk_buff local_ip6", 1553 .insns = { 1554 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1555 offsetof(struct __sk_buff, local_ip6)), 1556 BPF_EXIT_INSN(), 1557 }, 1558 .errstr = "invalid bpf_context access", 1559 .result = REJECT, 1560 }, 1561 { 1562 "invalid access __sk_buff remote_port", 1563 .insns = { 1564 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1565 offsetof(struct __sk_buff, remote_port)), 1566 BPF_EXIT_INSN(), 1567 }, 1568 .errstr = "invalid bpf_context access", 1569 .result = REJECT, 1570 }, 1571 { 1572 "invalid access __sk_buff remote_port", 1573 .insns = { 1574 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1575 offsetof(struct __sk_buff, local_port)), 1576 BPF_EXIT_INSN(), 1577 }, 1578 .errstr = "invalid bpf_context access", 1579 .result = REJECT, 1580 }, 1581 { 1582 "valid access __sk_buff family", 1583 .insns = { 1584 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1585 offsetof(struct __sk_buff, family)), 1586 BPF_EXIT_INSN(), 1587 }, 1588 .result = ACCEPT, 1589 .prog_type = BPF_PROG_TYPE_SK_SKB, 1590 }, 1591 { 1592 "valid access __sk_buff remote_ip4", 1593 .insns = { 1594 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1595 offsetof(struct __sk_buff, remote_ip4)), 1596 BPF_EXIT_INSN(), 1597 }, 1598 .result = ACCEPT, 1599 .prog_type = BPF_PROG_TYPE_SK_SKB, 1600 }, 1601 { 1602 "valid access __sk_buff local_ip4", 1603 .insns = { 1604 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1605 offsetof(struct __sk_buff, local_ip4)), 1606 BPF_EXIT_INSN(), 1607 }, 1608 .result = ACCEPT, 1609 .prog_type = BPF_PROG_TYPE_SK_SKB, 1610 }, 1611 { 1612 "valid access __sk_buff remote_ip6", 1613 .insns = { 1614 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1615 offsetof(struct __sk_buff, remote_ip6[0])), 1616 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1617 offsetof(struct __sk_buff, remote_ip6[1])), 1618 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1619 offsetof(struct __sk_buff, remote_ip6[2])), 1620 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1621 offsetof(struct __sk_buff, remote_ip6[3])), 1622 BPF_EXIT_INSN(), 1623 }, 1624 .result = ACCEPT, 1625 .prog_type = BPF_PROG_TYPE_SK_SKB, 1626 }, 1627 { 1628 "valid access __sk_buff local_ip6", 1629 .insns = { 1630 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1631 offsetof(struct __sk_buff, local_ip6[0])), 1632 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1633 offsetof(struct __sk_buff, local_ip6[1])), 1634 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1635 offsetof(struct __sk_buff, local_ip6[2])), 1636 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1637 offsetof(struct __sk_buff, local_ip6[3])), 1638 BPF_EXIT_INSN(), 1639 }, 1640 .result = ACCEPT, 1641 .prog_type = BPF_PROG_TYPE_SK_SKB, 1642 }, 1643 { 1644 "valid access __sk_buff remote_port", 1645 .insns = { 1646 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1647 offsetof(struct __sk_buff, remote_port)), 1648 BPF_EXIT_INSN(), 1649 }, 1650 .result = ACCEPT, 1651 .prog_type = BPF_PROG_TYPE_SK_SKB, 1652 }, 1653 { 1654 "valid access __sk_buff remote_port", 1655 .insns = { 1656 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1657 offsetof(struct __sk_buff, local_port)), 1658 BPF_EXIT_INSN(), 1659 }, 1660 .result = ACCEPT, 1661 .prog_type = BPF_PROG_TYPE_SK_SKB, 1662 }, 1663 { 1664 "invalid access of tc_classid for SK_SKB", 1665 .insns = { 1666 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1667 offsetof(struct __sk_buff, tc_classid)), 1668 BPF_EXIT_INSN(), 1669 }, 1670 .result = REJECT, 1671 .prog_type = BPF_PROG_TYPE_SK_SKB, 1672 .errstr = "invalid bpf_context access", 1673 }, 1674 { 1675 "invalid access of skb->mark for SK_SKB", 1676 .insns = { 1677 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1678 offsetof(struct __sk_buff, mark)), 1679 BPF_EXIT_INSN(), 1680 }, 1681 .result = REJECT, 1682 .prog_type = BPF_PROG_TYPE_SK_SKB, 1683 .errstr = "invalid bpf_context access", 1684 }, 1685 { 1686 "check skb->mark is not writeable by SK_SKB", 1687 .insns = { 1688 BPF_MOV64_IMM(BPF_REG_0, 0), 1689 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1690 offsetof(struct __sk_buff, mark)), 1691 BPF_EXIT_INSN(), 1692 }, 1693 .result = REJECT, 1694 .prog_type = BPF_PROG_TYPE_SK_SKB, 1695 .errstr = "invalid bpf_context access", 1696 }, 1697 { 1698 "check skb->tc_index is writeable by SK_SKB", 1699 .insns = { 1700 BPF_MOV64_IMM(BPF_REG_0, 0), 1701 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1702 offsetof(struct __sk_buff, tc_index)), 1703 BPF_EXIT_INSN(), 1704 }, 1705 .result = ACCEPT, 1706 .prog_type = BPF_PROG_TYPE_SK_SKB, 1707 }, 1708 { 1709 "check skb->priority is writeable by SK_SKB", 1710 .insns = { 1711 BPF_MOV64_IMM(BPF_REG_0, 0), 1712 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1713 offsetof(struct __sk_buff, priority)), 1714 BPF_EXIT_INSN(), 1715 }, 1716 .result = ACCEPT, 1717 .prog_type = BPF_PROG_TYPE_SK_SKB, 1718 }, 1719 { 1720 "direct packet read for SK_SKB", 1721 .insns = { 1722 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1723 offsetof(struct __sk_buff, data)), 1724 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1725 offsetof(struct __sk_buff, data_end)), 1726 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1728 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1729 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1730 BPF_MOV64_IMM(BPF_REG_0, 0), 1731 BPF_EXIT_INSN(), 1732 }, 1733 .result = ACCEPT, 1734 .prog_type = BPF_PROG_TYPE_SK_SKB, 1735 }, 1736 { 1737 "direct packet write for SK_SKB", 1738 .insns = { 1739 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1740 offsetof(struct __sk_buff, data)), 1741 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1742 offsetof(struct __sk_buff, data_end)), 1743 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1745 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1746 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1747 BPF_MOV64_IMM(BPF_REG_0, 0), 1748 BPF_EXIT_INSN(), 1749 }, 1750 .result = ACCEPT, 1751 .prog_type = BPF_PROG_TYPE_SK_SKB, 1752 }, 1753 { 1754 "overlapping checks for direct packet access SK_SKB", 1755 .insns = { 1756 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1757 offsetof(struct __sk_buff, data)), 1758 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1759 offsetof(struct __sk_buff, data_end)), 1760 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1762 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1763 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1764 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1765 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1766 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1767 BPF_MOV64_IMM(BPF_REG_0, 0), 1768 BPF_EXIT_INSN(), 1769 }, 1770 .result = ACCEPT, 1771 .prog_type = BPF_PROG_TYPE_SK_SKB, 1772 }, 1773 { 1774 "valid access family in SK_MSG", 1775 .insns = { 1776 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1777 offsetof(struct sk_msg_md, family)), 1778 BPF_EXIT_INSN(), 1779 }, 1780 .result = ACCEPT, 1781 .prog_type = BPF_PROG_TYPE_SK_MSG, 1782 }, 1783 { 1784 "valid access remote_ip4 in SK_MSG", 1785 .insns = { 1786 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1787 offsetof(struct sk_msg_md, remote_ip4)), 1788 BPF_EXIT_INSN(), 1789 }, 1790 .result = ACCEPT, 1791 .prog_type = BPF_PROG_TYPE_SK_MSG, 1792 }, 1793 { 1794 "valid access local_ip4 in SK_MSG", 1795 .insns = { 1796 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1797 offsetof(struct sk_msg_md, local_ip4)), 1798 BPF_EXIT_INSN(), 1799 }, 1800 .result = ACCEPT, 1801 .prog_type = BPF_PROG_TYPE_SK_MSG, 1802 }, 1803 { 1804 "valid access remote_port in SK_MSG", 1805 .insns = { 1806 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1807 offsetof(struct sk_msg_md, remote_port)), 1808 BPF_EXIT_INSN(), 1809 }, 1810 .result = ACCEPT, 1811 .prog_type = BPF_PROG_TYPE_SK_MSG, 1812 }, 1813 { 1814 "valid access local_port in SK_MSG", 1815 .insns = { 1816 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1817 offsetof(struct sk_msg_md, local_port)), 1818 BPF_EXIT_INSN(), 1819 }, 1820 .result = ACCEPT, 1821 .prog_type = BPF_PROG_TYPE_SK_MSG, 1822 }, 1823 { 1824 "valid access remote_ip6 in SK_MSG", 1825 .insns = { 1826 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1827 offsetof(struct sk_msg_md, remote_ip6[0])), 1828 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1829 offsetof(struct sk_msg_md, remote_ip6[1])), 1830 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1831 offsetof(struct sk_msg_md, remote_ip6[2])), 1832 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1833 offsetof(struct sk_msg_md, remote_ip6[3])), 1834 BPF_EXIT_INSN(), 1835 }, 1836 .result = ACCEPT, 1837 .prog_type = BPF_PROG_TYPE_SK_SKB, 1838 }, 1839 { 1840 "valid access local_ip6 in SK_MSG", 1841 .insns = { 1842 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1843 offsetof(struct sk_msg_md, local_ip6[0])), 1844 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1845 offsetof(struct sk_msg_md, local_ip6[1])), 1846 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1847 offsetof(struct sk_msg_md, local_ip6[2])), 1848 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1849 offsetof(struct sk_msg_md, local_ip6[3])), 1850 BPF_EXIT_INSN(), 1851 }, 1852 .result = ACCEPT, 1853 .prog_type = BPF_PROG_TYPE_SK_SKB, 1854 }, 1855 { 1856 "valid access size in SK_MSG", 1857 .insns = { 1858 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1859 offsetof(struct sk_msg_md, size)), 1860 BPF_EXIT_INSN(), 1861 }, 1862 .result = ACCEPT, 1863 .prog_type = BPF_PROG_TYPE_SK_MSG, 1864 }, 1865 { 1866 "invalid 64B read of size in SK_MSG", 1867 .insns = { 1868 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1869 offsetof(struct sk_msg_md, size)), 1870 BPF_EXIT_INSN(), 1871 }, 1872 .errstr = "invalid bpf_context access", 1873 .result = REJECT, 1874 .prog_type = BPF_PROG_TYPE_SK_MSG, 1875 }, 1876 { 1877 "invalid read past end of SK_MSG", 1878 .insns = { 1879 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1880 offsetof(struct sk_msg_md, size) + 4), 1881 BPF_EXIT_INSN(), 1882 }, 1883 .errstr = "invalid bpf_context access", 1884 .result = REJECT, 1885 .prog_type = BPF_PROG_TYPE_SK_MSG, 1886 }, 1887 { 1888 "invalid read offset in SK_MSG", 1889 .insns = { 1890 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1891 offsetof(struct sk_msg_md, family) + 1), 1892 BPF_EXIT_INSN(), 1893 }, 1894 .errstr = "invalid bpf_context access", 1895 .result = REJECT, 1896 .prog_type = BPF_PROG_TYPE_SK_MSG, 1897 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 1898 }, 1899 { 1900 "direct packet read for SK_MSG", 1901 .insns = { 1902 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1903 offsetof(struct sk_msg_md, data)), 1904 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1905 offsetof(struct sk_msg_md, data_end)), 1906 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1907 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1908 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1909 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1910 BPF_MOV64_IMM(BPF_REG_0, 0), 1911 BPF_EXIT_INSN(), 1912 }, 1913 .result = ACCEPT, 1914 .prog_type = BPF_PROG_TYPE_SK_MSG, 1915 }, 1916 { 1917 "direct packet write for SK_MSG", 1918 .insns = { 1919 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1920 offsetof(struct sk_msg_md, data)), 1921 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1922 offsetof(struct sk_msg_md, data_end)), 1923 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1925 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1926 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1927 BPF_MOV64_IMM(BPF_REG_0, 0), 1928 BPF_EXIT_INSN(), 1929 }, 1930 .result = ACCEPT, 1931 .prog_type = BPF_PROG_TYPE_SK_MSG, 1932 }, 1933 { 1934 "overlapping checks for direct packet access SK_MSG", 1935 .insns = { 1936 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1937 offsetof(struct sk_msg_md, data)), 1938 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1939 offsetof(struct sk_msg_md, data_end)), 1940 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1941 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1942 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1943 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1944 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1945 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1946 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1947 BPF_MOV64_IMM(BPF_REG_0, 0), 1948 BPF_EXIT_INSN(), 1949 }, 1950 .result = ACCEPT, 1951 .prog_type = BPF_PROG_TYPE_SK_MSG, 1952 }, 1953 { 1954 "check skb->mark is not writeable by sockets", 1955 .insns = { 1956 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1957 offsetof(struct __sk_buff, mark)), 1958 BPF_EXIT_INSN(), 1959 }, 1960 .errstr = "invalid bpf_context access", 1961 .errstr_unpriv = "R1 leaks addr", 1962 .result = REJECT, 1963 }, 1964 { 1965 "check skb->tc_index is not writeable by sockets", 1966 .insns = { 1967 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1968 offsetof(struct __sk_buff, tc_index)), 1969 BPF_EXIT_INSN(), 1970 }, 1971 .errstr = "invalid bpf_context access", 1972 .errstr_unpriv = "R1 leaks addr", 1973 .result = REJECT, 1974 }, 1975 { 1976 "check cb access: byte", 1977 .insns = { 1978 BPF_MOV64_IMM(BPF_REG_0, 0), 1979 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1980 offsetof(struct __sk_buff, cb[0])), 1981 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1982 offsetof(struct __sk_buff, cb[0]) + 1), 1983 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1984 offsetof(struct __sk_buff, cb[0]) + 2), 1985 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1986 offsetof(struct __sk_buff, cb[0]) + 3), 1987 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1988 offsetof(struct __sk_buff, cb[1])), 1989 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1990 offsetof(struct __sk_buff, cb[1]) + 1), 1991 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1992 offsetof(struct __sk_buff, cb[1]) + 2), 1993 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1994 offsetof(struct __sk_buff, cb[1]) + 3), 1995 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1996 offsetof(struct __sk_buff, cb[2])), 1997 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1998 offsetof(struct __sk_buff, cb[2]) + 1), 1999 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2000 offsetof(struct __sk_buff, cb[2]) + 2), 2001 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2002 offsetof(struct __sk_buff, cb[2]) + 3), 2003 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2004 offsetof(struct __sk_buff, cb[3])), 2005 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2006 offsetof(struct __sk_buff, cb[3]) + 1), 2007 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2008 offsetof(struct __sk_buff, cb[3]) + 2), 2009 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2010 offsetof(struct __sk_buff, cb[3]) + 3), 2011 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2012 offsetof(struct __sk_buff, cb[4])), 2013 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2014 offsetof(struct __sk_buff, cb[4]) + 1), 2015 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2016 offsetof(struct __sk_buff, cb[4]) + 2), 2017 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2018 offsetof(struct __sk_buff, cb[4]) + 3), 2019 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2020 offsetof(struct __sk_buff, cb[0])), 2021 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2022 offsetof(struct __sk_buff, cb[0]) + 1), 2023 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2024 offsetof(struct __sk_buff, cb[0]) + 2), 2025 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2026 offsetof(struct __sk_buff, cb[0]) + 3), 2027 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2028 offsetof(struct __sk_buff, cb[1])), 2029 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2030 offsetof(struct __sk_buff, cb[1]) + 1), 2031 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2032 offsetof(struct __sk_buff, cb[1]) + 2), 2033 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2034 offsetof(struct __sk_buff, cb[1]) + 3), 2035 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2036 offsetof(struct __sk_buff, cb[2])), 2037 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2038 offsetof(struct __sk_buff, cb[2]) + 1), 2039 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2040 offsetof(struct __sk_buff, cb[2]) + 2), 2041 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2042 offsetof(struct __sk_buff, cb[2]) + 3), 2043 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2044 offsetof(struct __sk_buff, cb[3])), 2045 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2046 offsetof(struct __sk_buff, cb[3]) + 1), 2047 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2048 offsetof(struct __sk_buff, cb[3]) + 2), 2049 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2050 offsetof(struct __sk_buff, cb[3]) + 3), 2051 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2052 offsetof(struct __sk_buff, cb[4])), 2053 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2054 offsetof(struct __sk_buff, cb[4]) + 1), 2055 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2056 offsetof(struct __sk_buff, cb[4]) + 2), 2057 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2058 offsetof(struct __sk_buff, cb[4]) + 3), 2059 BPF_EXIT_INSN(), 2060 }, 2061 .result = ACCEPT, 2062 }, 2063 { 2064 "__sk_buff->hash, offset 0, byte store not permitted", 2065 .insns = { 2066 BPF_MOV64_IMM(BPF_REG_0, 0), 2067 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2068 offsetof(struct __sk_buff, hash)), 2069 BPF_EXIT_INSN(), 2070 }, 2071 .errstr = "invalid bpf_context access", 2072 .result = REJECT, 2073 }, 2074 { 2075 "__sk_buff->tc_index, offset 3, byte store not permitted", 2076 .insns = { 2077 BPF_MOV64_IMM(BPF_REG_0, 0), 2078 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2079 offsetof(struct __sk_buff, tc_index) + 3), 2080 BPF_EXIT_INSN(), 2081 }, 2082 .errstr = "invalid bpf_context access", 2083 .result = REJECT, 2084 }, 2085 { 2086 "check skb->hash byte load permitted", 2087 .insns = { 2088 BPF_MOV64_IMM(BPF_REG_0, 0), 2089 #if __BYTE_ORDER == __LITTLE_ENDIAN 2090 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2091 offsetof(struct __sk_buff, hash)), 2092 #else 2093 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2094 offsetof(struct __sk_buff, hash) + 3), 2095 #endif 2096 BPF_EXIT_INSN(), 2097 }, 2098 .result = ACCEPT, 2099 }, 2100 { 2101 "check skb->hash byte load permitted 1", 2102 .insns = { 2103 BPF_MOV64_IMM(BPF_REG_0, 0), 2104 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2105 offsetof(struct __sk_buff, hash) + 1), 2106 BPF_EXIT_INSN(), 2107 }, 2108 .result = ACCEPT, 2109 }, 2110 { 2111 "check skb->hash byte load permitted 2", 2112 .insns = { 2113 BPF_MOV64_IMM(BPF_REG_0, 0), 2114 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2115 offsetof(struct __sk_buff, hash) + 2), 2116 BPF_EXIT_INSN(), 2117 }, 2118 .result = ACCEPT, 2119 }, 2120 { 2121 "check skb->hash byte load permitted 3", 2122 .insns = { 2123 BPF_MOV64_IMM(BPF_REG_0, 0), 2124 #if __BYTE_ORDER == __LITTLE_ENDIAN 2125 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2126 offsetof(struct __sk_buff, hash) + 3), 2127 #else 2128 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 2129 offsetof(struct __sk_buff, hash)), 2130 #endif 2131 BPF_EXIT_INSN(), 2132 }, 2133 .result = ACCEPT, 2134 }, 2135 { 2136 "check cb access: byte, wrong type", 2137 .insns = { 2138 BPF_MOV64_IMM(BPF_REG_0, 0), 2139 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 2140 offsetof(struct __sk_buff, cb[0])), 2141 BPF_EXIT_INSN(), 2142 }, 2143 .errstr = "invalid bpf_context access", 2144 .result = REJECT, 2145 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2146 }, 2147 { 2148 "check cb access: half", 2149 .insns = { 2150 BPF_MOV64_IMM(BPF_REG_0, 0), 2151 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2152 offsetof(struct __sk_buff, cb[0])), 2153 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2154 offsetof(struct __sk_buff, cb[0]) + 2), 2155 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2156 offsetof(struct __sk_buff, cb[1])), 2157 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2158 offsetof(struct __sk_buff, cb[1]) + 2), 2159 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2160 offsetof(struct __sk_buff, cb[2])), 2161 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2162 offsetof(struct __sk_buff, cb[2]) + 2), 2163 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2164 offsetof(struct __sk_buff, cb[3])), 2165 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2166 offsetof(struct __sk_buff, cb[3]) + 2), 2167 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2168 offsetof(struct __sk_buff, cb[4])), 2169 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2170 offsetof(struct __sk_buff, cb[4]) + 2), 2171 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2172 offsetof(struct __sk_buff, cb[0])), 2173 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2174 offsetof(struct __sk_buff, cb[0]) + 2), 2175 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2176 offsetof(struct __sk_buff, cb[1])), 2177 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2178 offsetof(struct __sk_buff, cb[1]) + 2), 2179 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2180 offsetof(struct __sk_buff, cb[2])), 2181 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2182 offsetof(struct __sk_buff, cb[2]) + 2), 2183 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2184 offsetof(struct __sk_buff, cb[3])), 2185 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2186 offsetof(struct __sk_buff, cb[3]) + 2), 2187 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2188 offsetof(struct __sk_buff, cb[4])), 2189 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2190 offsetof(struct __sk_buff, cb[4]) + 2), 2191 BPF_EXIT_INSN(), 2192 }, 2193 .result = ACCEPT, 2194 }, 2195 { 2196 "check cb access: half, unaligned", 2197 .insns = { 2198 BPF_MOV64_IMM(BPF_REG_0, 0), 2199 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2200 offsetof(struct __sk_buff, cb[0]) + 1), 2201 BPF_EXIT_INSN(), 2202 }, 2203 .errstr = "misaligned context access", 2204 .result = REJECT, 2205 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2206 }, 2207 { 2208 "check __sk_buff->hash, offset 0, half store not permitted", 2209 .insns = { 2210 BPF_MOV64_IMM(BPF_REG_0, 0), 2211 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2212 offsetof(struct __sk_buff, hash)), 2213 BPF_EXIT_INSN(), 2214 }, 2215 .errstr = "invalid bpf_context access", 2216 .result = REJECT, 2217 }, 2218 { 2219 "check __sk_buff->tc_index, offset 2, half store not permitted", 2220 .insns = { 2221 BPF_MOV64_IMM(BPF_REG_0, 0), 2222 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2223 offsetof(struct __sk_buff, tc_index) + 2), 2224 BPF_EXIT_INSN(), 2225 }, 2226 .errstr = "invalid bpf_context access", 2227 .result = REJECT, 2228 }, 2229 { 2230 "check skb->hash half load permitted", 2231 .insns = { 2232 BPF_MOV64_IMM(BPF_REG_0, 0), 2233 #if __BYTE_ORDER == __LITTLE_ENDIAN 2234 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2235 offsetof(struct __sk_buff, hash)), 2236 #else 2237 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2238 offsetof(struct __sk_buff, hash) + 2), 2239 #endif 2240 BPF_EXIT_INSN(), 2241 }, 2242 .result = ACCEPT, 2243 }, 2244 { 2245 "check skb->hash half load permitted 2", 2246 .insns = { 2247 BPF_MOV64_IMM(BPF_REG_0, 0), 2248 #if __BYTE_ORDER == __LITTLE_ENDIAN 2249 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2250 offsetof(struct __sk_buff, hash) + 2), 2251 #else 2252 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2253 offsetof(struct __sk_buff, hash)), 2254 #endif 2255 BPF_EXIT_INSN(), 2256 }, 2257 .result = ACCEPT, 2258 }, 2259 { 2260 "check skb->hash half load not permitted, unaligned 1", 2261 .insns = { 2262 BPF_MOV64_IMM(BPF_REG_0, 0), 2263 #if __BYTE_ORDER == __LITTLE_ENDIAN 2264 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2265 offsetof(struct __sk_buff, hash) + 1), 2266 #else 2267 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2268 offsetof(struct __sk_buff, hash) + 3), 2269 #endif 2270 BPF_EXIT_INSN(), 2271 }, 2272 .errstr = "invalid bpf_context access", 2273 .result = REJECT, 2274 }, 2275 { 2276 "check skb->hash half load not permitted, unaligned 3", 2277 .insns = { 2278 BPF_MOV64_IMM(BPF_REG_0, 0), 2279 #if __BYTE_ORDER == __LITTLE_ENDIAN 2280 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2281 offsetof(struct __sk_buff, hash) + 3), 2282 #else 2283 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2284 offsetof(struct __sk_buff, hash) + 1), 2285 #endif 2286 BPF_EXIT_INSN(), 2287 }, 2288 .errstr = "invalid bpf_context access", 2289 .result = REJECT, 2290 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2291 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 2292 }, 2293 { 2294 "check cb access: half, wrong type", 2295 .insns = { 2296 BPF_MOV64_IMM(BPF_REG_0, 0), 2297 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2298 offsetof(struct __sk_buff, cb[0])), 2299 BPF_EXIT_INSN(), 2300 }, 2301 .errstr = "invalid bpf_context access", 2302 .result = REJECT, 2303 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2304 }, 2305 { 2306 "check cb access: word", 2307 .insns = { 2308 BPF_MOV64_IMM(BPF_REG_0, 0), 2309 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2310 offsetof(struct __sk_buff, cb[0])), 2311 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2312 offsetof(struct __sk_buff, cb[1])), 2313 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2314 offsetof(struct __sk_buff, cb[2])), 2315 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2316 offsetof(struct __sk_buff, cb[3])), 2317 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2318 offsetof(struct __sk_buff, cb[4])), 2319 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2320 offsetof(struct __sk_buff, cb[0])), 2321 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2322 offsetof(struct __sk_buff, cb[1])), 2323 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2324 offsetof(struct __sk_buff, cb[2])), 2325 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2326 offsetof(struct __sk_buff, cb[3])), 2327 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2328 offsetof(struct __sk_buff, cb[4])), 2329 BPF_EXIT_INSN(), 2330 }, 2331 .result = ACCEPT, 2332 }, 2333 { 2334 "check cb access: word, unaligned 1", 2335 .insns = { 2336 BPF_MOV64_IMM(BPF_REG_0, 0), 2337 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2338 offsetof(struct __sk_buff, cb[0]) + 2), 2339 BPF_EXIT_INSN(), 2340 }, 2341 .errstr = "misaligned context access", 2342 .result = REJECT, 2343 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2344 }, 2345 { 2346 "check cb access: word, unaligned 2", 2347 .insns = { 2348 BPF_MOV64_IMM(BPF_REG_0, 0), 2349 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2350 offsetof(struct __sk_buff, cb[4]) + 1), 2351 BPF_EXIT_INSN(), 2352 }, 2353 .errstr = "misaligned context access", 2354 .result = REJECT, 2355 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2356 }, 2357 { 2358 "check cb access: word, unaligned 3", 2359 .insns = { 2360 BPF_MOV64_IMM(BPF_REG_0, 0), 2361 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2362 offsetof(struct __sk_buff, cb[4]) + 2), 2363 BPF_EXIT_INSN(), 2364 }, 2365 .errstr = "misaligned context access", 2366 .result = REJECT, 2367 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2368 }, 2369 { 2370 "check cb access: word, unaligned 4", 2371 .insns = { 2372 BPF_MOV64_IMM(BPF_REG_0, 0), 2373 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2374 offsetof(struct __sk_buff, cb[4]) + 3), 2375 BPF_EXIT_INSN(), 2376 }, 2377 .errstr = "misaligned context access", 2378 .result = REJECT, 2379 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2380 }, 2381 { 2382 "check cb access: double", 2383 .insns = { 2384 BPF_MOV64_IMM(BPF_REG_0, 0), 2385 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2386 offsetof(struct __sk_buff, cb[0])), 2387 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2388 offsetof(struct __sk_buff, cb[2])), 2389 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2390 offsetof(struct __sk_buff, cb[0])), 2391 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2392 offsetof(struct __sk_buff, cb[2])), 2393 BPF_EXIT_INSN(), 2394 }, 2395 .result = ACCEPT, 2396 }, 2397 { 2398 "check cb access: double, unaligned 1", 2399 .insns = { 2400 BPF_MOV64_IMM(BPF_REG_0, 0), 2401 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2402 offsetof(struct __sk_buff, cb[1])), 2403 BPF_EXIT_INSN(), 2404 }, 2405 .errstr = "misaligned context access", 2406 .result = REJECT, 2407 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2408 }, 2409 { 2410 "check cb access: double, unaligned 2", 2411 .insns = { 2412 BPF_MOV64_IMM(BPF_REG_0, 0), 2413 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2414 offsetof(struct __sk_buff, cb[3])), 2415 BPF_EXIT_INSN(), 2416 }, 2417 .errstr = "misaligned context access", 2418 .result = REJECT, 2419 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2420 }, 2421 { 2422 "check cb access: double, oob 1", 2423 .insns = { 2424 BPF_MOV64_IMM(BPF_REG_0, 0), 2425 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2426 offsetof(struct __sk_buff, cb[4])), 2427 BPF_EXIT_INSN(), 2428 }, 2429 .errstr = "invalid bpf_context access", 2430 .result = REJECT, 2431 }, 2432 { 2433 "check cb access: double, oob 2", 2434 .insns = { 2435 BPF_MOV64_IMM(BPF_REG_0, 0), 2436 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2437 offsetof(struct __sk_buff, cb[4])), 2438 BPF_EXIT_INSN(), 2439 }, 2440 .errstr = "invalid bpf_context access", 2441 .result = REJECT, 2442 }, 2443 { 2444 "check __sk_buff->ifindex dw store not permitted", 2445 .insns = { 2446 BPF_MOV64_IMM(BPF_REG_0, 0), 2447 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2448 offsetof(struct __sk_buff, ifindex)), 2449 BPF_EXIT_INSN(), 2450 }, 2451 .errstr = "invalid bpf_context access", 2452 .result = REJECT, 2453 }, 2454 { 2455 "check __sk_buff->ifindex dw load not permitted", 2456 .insns = { 2457 BPF_MOV64_IMM(BPF_REG_0, 0), 2458 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2459 offsetof(struct __sk_buff, ifindex)), 2460 BPF_EXIT_INSN(), 2461 }, 2462 .errstr = "invalid bpf_context access", 2463 .result = REJECT, 2464 }, 2465 { 2466 "check cb access: double, wrong type", 2467 .insns = { 2468 BPF_MOV64_IMM(BPF_REG_0, 0), 2469 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2470 offsetof(struct __sk_buff, cb[0])), 2471 BPF_EXIT_INSN(), 2472 }, 2473 .errstr = "invalid bpf_context access", 2474 .result = REJECT, 2475 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2476 }, 2477 { 2478 "check out of range skb->cb access", 2479 .insns = { 2480 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2481 offsetof(struct __sk_buff, cb[0]) + 256), 2482 BPF_EXIT_INSN(), 2483 }, 2484 .errstr = "invalid bpf_context access", 2485 .errstr_unpriv = "", 2486 .result = REJECT, 2487 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 2488 }, 2489 { 2490 "write skb fields from socket prog", 2491 .insns = { 2492 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2493 offsetof(struct __sk_buff, cb[4])), 2494 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2495 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2496 offsetof(struct __sk_buff, mark)), 2497 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2498 offsetof(struct __sk_buff, tc_index)), 2499 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2500 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2501 offsetof(struct __sk_buff, cb[0])), 2502 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2503 offsetof(struct __sk_buff, cb[2])), 2504 BPF_EXIT_INSN(), 2505 }, 2506 .result = ACCEPT, 2507 .errstr_unpriv = "R1 leaks addr", 2508 .result_unpriv = REJECT, 2509 }, 2510 { 2511 "write skb fields from tc_cls_act prog", 2512 .insns = { 2513 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2514 offsetof(struct __sk_buff, cb[0])), 2515 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2516 offsetof(struct __sk_buff, mark)), 2517 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2518 offsetof(struct __sk_buff, tc_index)), 2519 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2520 offsetof(struct __sk_buff, tc_index)), 2521 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2522 offsetof(struct __sk_buff, cb[3])), 2523 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2524 offsetof(struct __sk_buff, tstamp)), 2525 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2526 offsetof(struct __sk_buff, tstamp)), 2527 BPF_EXIT_INSN(), 2528 }, 2529 .errstr_unpriv = "", 2530 .result_unpriv = REJECT, 2531 .result = ACCEPT, 2532 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2533 }, 2534 { 2535 "PTR_TO_STACK store/load", 2536 .insns = { 2537 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2538 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2539 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2540 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2541 BPF_EXIT_INSN(), 2542 }, 2543 .result = ACCEPT, 2544 .retval = 0xfaceb00c, 2545 }, 2546 { 2547 "PTR_TO_STACK store/load - bad alignment on off", 2548 .insns = { 2549 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2550 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2551 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2552 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2553 BPF_EXIT_INSN(), 2554 }, 2555 .result = REJECT, 2556 .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", 2557 }, 2558 { 2559 "PTR_TO_STACK store/load - bad alignment on reg", 2560 .insns = { 2561 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2562 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2563 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2564 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2565 BPF_EXIT_INSN(), 2566 }, 2567 .result = REJECT, 2568 .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", 2569 }, 2570 { 2571 "PTR_TO_STACK store/load - out of bounds low", 2572 .insns = { 2573 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2574 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000), 2575 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2576 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2577 BPF_EXIT_INSN(), 2578 }, 2579 .result = REJECT, 2580 .errstr = "invalid stack off=-79992 size=8", 2581 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 2582 }, 2583 { 2584 "PTR_TO_STACK store/load - out of bounds high", 2585 .insns = { 2586 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2587 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2588 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2589 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2590 BPF_EXIT_INSN(), 2591 }, 2592 .result = REJECT, 2593 .errstr = "invalid stack off=0 size=8", 2594 }, 2595 { 2596 "unpriv: return pointer", 2597 .insns = { 2598 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 2599 BPF_EXIT_INSN(), 2600 }, 2601 .result = ACCEPT, 2602 .result_unpriv = REJECT, 2603 .errstr_unpriv = "R0 leaks addr", 2604 .retval = POINTER_VALUE, 2605 }, 2606 { 2607 "unpriv: add const to pointer", 2608 .insns = { 2609 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 2610 BPF_MOV64_IMM(BPF_REG_0, 0), 2611 BPF_EXIT_INSN(), 2612 }, 2613 .result = ACCEPT, 2614 }, 2615 { 2616 "unpriv: add pointer to pointer", 2617 .insns = { 2618 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 2619 BPF_MOV64_IMM(BPF_REG_0, 0), 2620 BPF_EXIT_INSN(), 2621 }, 2622 .result = REJECT, 2623 .errstr = "R1 pointer += pointer", 2624 }, 2625 { 2626 "unpriv: neg pointer", 2627 .insns = { 2628 BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0), 2629 BPF_MOV64_IMM(BPF_REG_0, 0), 2630 BPF_EXIT_INSN(), 2631 }, 2632 .result = ACCEPT, 2633 .result_unpriv = REJECT, 2634 .errstr_unpriv = "R1 pointer arithmetic", 2635 }, 2636 { 2637 "unpriv: cmp pointer with const", 2638 .insns = { 2639 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 2640 BPF_MOV64_IMM(BPF_REG_0, 0), 2641 BPF_EXIT_INSN(), 2642 }, 2643 .result = ACCEPT, 2644 .result_unpriv = REJECT, 2645 .errstr_unpriv = "R1 pointer comparison", 2646 }, 2647 { 2648 "unpriv: cmp pointer with pointer", 2649 .insns = { 2650 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 2651 BPF_MOV64_IMM(BPF_REG_0, 0), 2652 BPF_EXIT_INSN(), 2653 }, 2654 .result = ACCEPT, 2655 .result_unpriv = REJECT, 2656 .errstr_unpriv = "R10 pointer comparison", 2657 }, 2658 { 2659 "unpriv: check that printk is disallowed", 2660 .insns = { 2661 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2662 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2663 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2664 BPF_MOV64_IMM(BPF_REG_2, 8), 2665 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2666 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2667 BPF_FUNC_trace_printk), 2668 BPF_MOV64_IMM(BPF_REG_0, 0), 2669 BPF_EXIT_INSN(), 2670 }, 2671 .errstr_unpriv = "unknown func bpf_trace_printk#6", 2672 .result_unpriv = REJECT, 2673 .result = ACCEPT, 2674 }, 2675 { 2676 "unpriv: pass pointer to helper function", 2677 .insns = { 2678 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2679 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2680 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2681 BPF_LD_MAP_FD(BPF_REG_1, 0), 2682 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 2683 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 2684 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2685 BPF_FUNC_map_update_elem), 2686 BPF_MOV64_IMM(BPF_REG_0, 0), 2687 BPF_EXIT_INSN(), 2688 }, 2689 .fixup_map_hash_8b = { 3 }, 2690 .errstr_unpriv = "R4 leaks addr", 2691 .result_unpriv = REJECT, 2692 .result = ACCEPT, 2693 }, 2694 { 2695 "unpriv: indirectly pass pointer on stack to helper function", 2696 .insns = { 2697 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2698 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2700 BPF_LD_MAP_FD(BPF_REG_1, 0), 2701 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2702 BPF_FUNC_map_lookup_elem), 2703 BPF_MOV64_IMM(BPF_REG_0, 0), 2704 BPF_EXIT_INSN(), 2705 }, 2706 .fixup_map_hash_8b = { 3 }, 2707 .errstr = "invalid indirect read from stack off -8+0 size 8", 2708 .result = REJECT, 2709 }, 2710 { 2711 "unpriv: mangle pointer on stack 1", 2712 .insns = { 2713 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2714 BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0), 2715 BPF_MOV64_IMM(BPF_REG_0, 0), 2716 BPF_EXIT_INSN(), 2717 }, 2718 .errstr_unpriv = "attempt to corrupt spilled", 2719 .result_unpriv = REJECT, 2720 .result = ACCEPT, 2721 }, 2722 { 2723 "unpriv: mangle pointer on stack 2", 2724 .insns = { 2725 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2726 BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0), 2727 BPF_MOV64_IMM(BPF_REG_0, 0), 2728 BPF_EXIT_INSN(), 2729 }, 2730 .errstr_unpriv = "attempt to corrupt spilled", 2731 .result_unpriv = REJECT, 2732 .result = ACCEPT, 2733 }, 2734 { 2735 "unpriv: read pointer from stack in small chunks", 2736 .insns = { 2737 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2738 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 2739 BPF_MOV64_IMM(BPF_REG_0, 0), 2740 BPF_EXIT_INSN(), 2741 }, 2742 .errstr = "invalid size", 2743 .result = REJECT, 2744 }, 2745 { 2746 "unpriv: write pointer into ctx", 2747 .insns = { 2748 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 2749 BPF_MOV64_IMM(BPF_REG_0, 0), 2750 BPF_EXIT_INSN(), 2751 }, 2752 .errstr_unpriv = "R1 leaks addr", 2753 .result_unpriv = REJECT, 2754 .errstr = "invalid bpf_context access", 2755 .result = REJECT, 2756 }, 2757 { 2758 "unpriv: spill/fill of ctx", 2759 .insns = { 2760 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2762 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2763 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2764 BPF_MOV64_IMM(BPF_REG_0, 0), 2765 BPF_EXIT_INSN(), 2766 }, 2767 .result = ACCEPT, 2768 }, 2769 { 2770 "unpriv: spill/fill of ctx 2", 2771 .insns = { 2772 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2773 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2774 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2775 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2776 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2777 BPF_FUNC_get_hash_recalc), 2778 BPF_MOV64_IMM(BPF_REG_0, 0), 2779 BPF_EXIT_INSN(), 2780 }, 2781 .result = ACCEPT, 2782 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2783 }, 2784 { 2785 "unpriv: spill/fill of ctx 3", 2786 .insns = { 2787 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2788 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2789 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2790 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 2791 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2792 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2793 BPF_FUNC_get_hash_recalc), 2794 BPF_EXIT_INSN(), 2795 }, 2796 .result = REJECT, 2797 .errstr = "R1 type=fp expected=ctx", 2798 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2799 }, 2800 { 2801 "unpriv: spill/fill of ctx 4", 2802 .insns = { 2803 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2804 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2805 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2806 BPF_MOV64_IMM(BPF_REG_0, 1), 2807 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10, 2808 BPF_REG_0, -8, 0), 2809 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2810 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2811 BPF_FUNC_get_hash_recalc), 2812 BPF_EXIT_INSN(), 2813 }, 2814 .result = REJECT, 2815 .errstr = "R1 type=inv expected=ctx", 2816 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2817 }, 2818 { 2819 "unpriv: spill/fill of different pointers stx", 2820 .insns = { 2821 BPF_MOV64_IMM(BPF_REG_3, 42), 2822 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2824 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2825 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 2827 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2828 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2829 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2830 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2831 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2832 offsetof(struct __sk_buff, mark)), 2833 BPF_MOV64_IMM(BPF_REG_0, 0), 2834 BPF_EXIT_INSN(), 2835 }, 2836 .result = REJECT, 2837 .errstr = "same insn cannot be used with different pointers", 2838 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2839 }, 2840 { 2841 "unpriv: spill/fill of different pointers stx - ctx and sock", 2842 .insns = { 2843 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2844 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2845 BPF_SK_LOOKUP, 2846 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2847 /* u64 foo; */ 2848 /* void *target = &foo; */ 2849 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2850 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2851 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2852 /* if (skb == NULL) *target = sock; */ 2853 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2854 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2855 /* else *target = skb; */ 2856 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2857 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2858 /* struct __sk_buff *skb = *target; */ 2859 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2860 /* skb->mark = 42; */ 2861 BPF_MOV64_IMM(BPF_REG_3, 42), 2862 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2863 offsetof(struct __sk_buff, mark)), 2864 /* if (sk) bpf_sk_release(sk) */ 2865 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2866 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2867 BPF_MOV64_IMM(BPF_REG_0, 0), 2868 BPF_EXIT_INSN(), 2869 }, 2870 .result = REJECT, 2871 .errstr = "type=ctx expected=sock", 2872 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2873 }, 2874 { 2875 "unpriv: spill/fill of different pointers stx - leak sock", 2876 .insns = { 2877 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2878 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2879 BPF_SK_LOOKUP, 2880 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2881 /* u64 foo; */ 2882 /* void *target = &foo; */ 2883 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2884 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2885 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2886 /* if (skb == NULL) *target = sock; */ 2887 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2888 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2889 /* else *target = skb; */ 2890 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2891 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2892 /* struct __sk_buff *skb = *target; */ 2893 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2894 /* skb->mark = 42; */ 2895 BPF_MOV64_IMM(BPF_REG_3, 42), 2896 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2897 offsetof(struct __sk_buff, mark)), 2898 BPF_EXIT_INSN(), 2899 }, 2900 .result = REJECT, 2901 //.errstr = "same insn cannot be used with different pointers", 2902 .errstr = "Unreleased reference", 2903 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2904 }, 2905 { 2906 "unpriv: spill/fill of different pointers stx - sock and ctx (read)", 2907 .insns = { 2908 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2909 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2910 BPF_SK_LOOKUP, 2911 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2912 /* u64 foo; */ 2913 /* void *target = &foo; */ 2914 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2915 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2916 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2917 /* if (skb) *target = skb */ 2918 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2919 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2920 /* else *target = sock */ 2921 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2922 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2923 /* struct bpf_sock *sk = *target; */ 2924 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2925 /* if (sk) u32 foo = sk->mark; bpf_sk_release(sk); */ 2926 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 2927 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 2928 offsetof(struct bpf_sock, mark)), 2929 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2930 BPF_MOV64_IMM(BPF_REG_0, 0), 2931 BPF_EXIT_INSN(), 2932 }, 2933 .result = REJECT, 2934 .errstr = "same insn cannot be used with different pointers", 2935 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2936 }, 2937 { 2938 "unpriv: spill/fill of different pointers stx - sock and ctx (write)", 2939 .insns = { 2940 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 2941 /* struct bpf_sock *sock = bpf_sock_lookup(...); */ 2942 BPF_SK_LOOKUP, 2943 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 2944 /* u64 foo; */ 2945 /* void *target = &foo; */ 2946 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2948 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 2949 /* if (skb) *target = skb */ 2950 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 2951 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2952 /* else *target = sock */ 2953 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2954 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2955 /* struct bpf_sock *sk = *target; */ 2956 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2957 /* if (sk) sk->mark = 42; bpf_sk_release(sk); */ 2958 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2959 BPF_MOV64_IMM(BPF_REG_3, 42), 2960 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2961 offsetof(struct bpf_sock, mark)), 2962 BPF_EMIT_CALL(BPF_FUNC_sk_release), 2963 BPF_MOV64_IMM(BPF_REG_0, 0), 2964 BPF_EXIT_INSN(), 2965 }, 2966 .result = REJECT, 2967 //.errstr = "same insn cannot be used with different pointers", 2968 .errstr = "cannot write into socket", 2969 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2970 }, 2971 { 2972 "unpriv: spill/fill of different pointers ldx", 2973 .insns = { 2974 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2976 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2977 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2978 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 2979 -(__s32)offsetof(struct bpf_perf_event_data, 2980 sample_period) - 8), 2981 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2982 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2983 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2984 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2985 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 2986 offsetof(struct bpf_perf_event_data, 2987 sample_period)), 2988 BPF_MOV64_IMM(BPF_REG_0, 0), 2989 BPF_EXIT_INSN(), 2990 }, 2991 .result = REJECT, 2992 .errstr = "same insn cannot be used with different pointers", 2993 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 2994 }, 2995 { 2996 "unpriv: write pointer into map elem value", 2997 .insns = { 2998 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2999 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3000 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3001 BPF_LD_MAP_FD(BPF_REG_1, 0), 3002 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3003 BPF_FUNC_map_lookup_elem), 3004 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 3005 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 3006 BPF_EXIT_INSN(), 3007 }, 3008 .fixup_map_hash_8b = { 3 }, 3009 .errstr_unpriv = "R0 leaks addr", 3010 .result_unpriv = REJECT, 3011 .result = ACCEPT, 3012 }, 3013 { 3014 "alu32: mov u32 const", 3015 .insns = { 3016 BPF_MOV32_IMM(BPF_REG_7, 0), 3017 BPF_ALU32_IMM(BPF_AND, BPF_REG_7, 1), 3018 BPF_MOV32_REG(BPF_REG_0, BPF_REG_7), 3019 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 3020 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 3021 BPF_EXIT_INSN(), 3022 }, 3023 .result = ACCEPT, 3024 .retval = 0, 3025 }, 3026 { 3027 "unpriv: partial copy of pointer", 3028 .insns = { 3029 BPF_MOV32_REG(BPF_REG_1, BPF_REG_10), 3030 BPF_MOV64_IMM(BPF_REG_0, 0), 3031 BPF_EXIT_INSN(), 3032 }, 3033 .errstr_unpriv = "R10 partial copy", 3034 .result_unpriv = REJECT, 3035 .result = ACCEPT, 3036 }, 3037 { 3038 "unpriv: pass pointer to tail_call", 3039 .insns = { 3040 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 3041 BPF_LD_MAP_FD(BPF_REG_2, 0), 3042 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3043 BPF_FUNC_tail_call), 3044 BPF_MOV64_IMM(BPF_REG_0, 0), 3045 BPF_EXIT_INSN(), 3046 }, 3047 .fixup_prog1 = { 1 }, 3048 .errstr_unpriv = "R3 leaks addr into helper", 3049 .result_unpriv = REJECT, 3050 .result = ACCEPT, 3051 }, 3052 { 3053 "unpriv: cmp map pointer with zero", 3054 .insns = { 3055 BPF_MOV64_IMM(BPF_REG_1, 0), 3056 BPF_LD_MAP_FD(BPF_REG_1, 0), 3057 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 3058 BPF_MOV64_IMM(BPF_REG_0, 0), 3059 BPF_EXIT_INSN(), 3060 }, 3061 .fixup_map_hash_8b = { 1 }, 3062 .errstr_unpriv = "R1 pointer comparison", 3063 .result_unpriv = REJECT, 3064 .result = ACCEPT, 3065 }, 3066 { 3067 "unpriv: write into frame pointer", 3068 .insns = { 3069 BPF_MOV64_REG(BPF_REG_10, BPF_REG_1), 3070 BPF_MOV64_IMM(BPF_REG_0, 0), 3071 BPF_EXIT_INSN(), 3072 }, 3073 .errstr = "frame pointer is read only", 3074 .result = REJECT, 3075 }, 3076 { 3077 "unpriv: spill/fill frame pointer", 3078 .insns = { 3079 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3080 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3081 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 3082 BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0), 3083 BPF_MOV64_IMM(BPF_REG_0, 0), 3084 BPF_EXIT_INSN(), 3085 }, 3086 .errstr = "frame pointer is read only", 3087 .result = REJECT, 3088 }, 3089 { 3090 "unpriv: cmp of frame pointer", 3091 .insns = { 3092 BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0), 3093 BPF_MOV64_IMM(BPF_REG_0, 0), 3094 BPF_EXIT_INSN(), 3095 }, 3096 .errstr_unpriv = "R10 pointer comparison", 3097 .result_unpriv = REJECT, 3098 .result = ACCEPT, 3099 }, 3100 { 3101 "unpriv: adding of fp", 3102 .insns = { 3103 BPF_MOV64_IMM(BPF_REG_0, 0), 3104 BPF_MOV64_IMM(BPF_REG_1, 0), 3105 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 3106 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 3107 BPF_EXIT_INSN(), 3108 }, 3109 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3110 .result_unpriv = REJECT, 3111 .result = ACCEPT, 3112 }, 3113 { 3114 "unpriv: cmp of stack pointer", 3115 .insns = { 3116 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3117 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3118 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0), 3119 BPF_MOV64_IMM(BPF_REG_0, 0), 3120 BPF_EXIT_INSN(), 3121 }, 3122 .errstr_unpriv = "R2 pointer comparison", 3123 .result_unpriv = REJECT, 3124 .result = ACCEPT, 3125 }, 3126 { 3127 "runtime/jit: tail_call within bounds, prog once", 3128 .insns = { 3129 BPF_MOV64_IMM(BPF_REG_3, 0), 3130 BPF_LD_MAP_FD(BPF_REG_2, 0), 3131 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3132 BPF_FUNC_tail_call), 3133 BPF_MOV64_IMM(BPF_REG_0, 1), 3134 BPF_EXIT_INSN(), 3135 }, 3136 .fixup_prog1 = { 1 }, 3137 .result = ACCEPT, 3138 .retval = 42, 3139 }, 3140 { 3141 "runtime/jit: tail_call within bounds, prog loop", 3142 .insns = { 3143 BPF_MOV64_IMM(BPF_REG_3, 1), 3144 BPF_LD_MAP_FD(BPF_REG_2, 0), 3145 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3146 BPF_FUNC_tail_call), 3147 BPF_MOV64_IMM(BPF_REG_0, 1), 3148 BPF_EXIT_INSN(), 3149 }, 3150 .fixup_prog1 = { 1 }, 3151 .result = ACCEPT, 3152 .retval = 41, 3153 }, 3154 { 3155 "runtime/jit: tail_call within bounds, no prog", 3156 .insns = { 3157 BPF_MOV64_IMM(BPF_REG_3, 2), 3158 BPF_LD_MAP_FD(BPF_REG_2, 0), 3159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3160 BPF_FUNC_tail_call), 3161 BPF_MOV64_IMM(BPF_REG_0, 1), 3162 BPF_EXIT_INSN(), 3163 }, 3164 .fixup_prog1 = { 1 }, 3165 .result = ACCEPT, 3166 .retval = 1, 3167 }, 3168 { 3169 "runtime/jit: tail_call out of bounds", 3170 .insns = { 3171 BPF_MOV64_IMM(BPF_REG_3, 256), 3172 BPF_LD_MAP_FD(BPF_REG_2, 0), 3173 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3174 BPF_FUNC_tail_call), 3175 BPF_MOV64_IMM(BPF_REG_0, 2), 3176 BPF_EXIT_INSN(), 3177 }, 3178 .fixup_prog1 = { 1 }, 3179 .result = ACCEPT, 3180 .retval = 2, 3181 }, 3182 { 3183 "runtime/jit: pass negative index to tail_call", 3184 .insns = { 3185 BPF_MOV64_IMM(BPF_REG_3, -1), 3186 BPF_LD_MAP_FD(BPF_REG_2, 0), 3187 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3188 BPF_FUNC_tail_call), 3189 BPF_MOV64_IMM(BPF_REG_0, 2), 3190 BPF_EXIT_INSN(), 3191 }, 3192 .fixup_prog1 = { 1 }, 3193 .result = ACCEPT, 3194 .retval = 2, 3195 }, 3196 { 3197 "runtime/jit: pass > 32bit index to tail_call", 3198 .insns = { 3199 BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL), 3200 BPF_LD_MAP_FD(BPF_REG_2, 0), 3201 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3202 BPF_FUNC_tail_call), 3203 BPF_MOV64_IMM(BPF_REG_0, 2), 3204 BPF_EXIT_INSN(), 3205 }, 3206 .fixup_prog1 = { 2 }, 3207 .result = ACCEPT, 3208 .retval = 42, 3209 /* Verifier rewrite for unpriv skips tail call here. */ 3210 .retval_unpriv = 2, 3211 }, 3212 { 3213 "PTR_TO_STACK check high 1", 3214 .insns = { 3215 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 3217 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3218 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3219 BPF_EXIT_INSN(), 3220 }, 3221 .result = ACCEPT, 3222 .retval = 42, 3223 }, 3224 { 3225 "PTR_TO_STACK check high 2", 3226 .insns = { 3227 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3228 BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), 3229 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), 3230 BPF_EXIT_INSN(), 3231 }, 3232 .result = ACCEPT, 3233 .retval = 42, 3234 }, 3235 { 3236 "PTR_TO_STACK check high 3", 3237 .insns = { 3238 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3239 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), 3240 BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), 3241 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), 3242 BPF_EXIT_INSN(), 3243 }, 3244 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3245 .result_unpriv = REJECT, 3246 .result = ACCEPT, 3247 .retval = 42, 3248 }, 3249 { 3250 "PTR_TO_STACK check high 4", 3251 .insns = { 3252 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), 3254 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3255 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3256 BPF_EXIT_INSN(), 3257 }, 3258 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3259 .errstr = "invalid stack off=0 size=1", 3260 .result = REJECT, 3261 }, 3262 { 3263 "PTR_TO_STACK check high 5", 3264 .insns = { 3265 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3266 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3267 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3268 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3269 BPF_EXIT_INSN(), 3270 }, 3271 .result = REJECT, 3272 .errstr = "invalid stack off", 3273 }, 3274 { 3275 "PTR_TO_STACK check high 6", 3276 .insns = { 3277 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3278 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3279 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), 3280 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), 3281 BPF_EXIT_INSN(), 3282 }, 3283 .result = REJECT, 3284 .errstr = "invalid stack off", 3285 }, 3286 { 3287 "PTR_TO_STACK check high 7", 3288 .insns = { 3289 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3290 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3291 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), 3292 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), 3293 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), 3294 BPF_EXIT_INSN(), 3295 }, 3296 .result = REJECT, 3297 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3298 .errstr = "fp pointer offset", 3299 }, 3300 { 3301 "PTR_TO_STACK check low 1", 3302 .insns = { 3303 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3304 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -512), 3305 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3306 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3307 BPF_EXIT_INSN(), 3308 }, 3309 .result = ACCEPT, 3310 .retval = 42, 3311 }, 3312 { 3313 "PTR_TO_STACK check low 2", 3314 .insns = { 3315 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), 3317 BPF_ST_MEM(BPF_B, BPF_REG_1, 1, 42), 3318 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1), 3319 BPF_EXIT_INSN(), 3320 }, 3321 .result_unpriv = REJECT, 3322 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3323 .result = ACCEPT, 3324 .retval = 42, 3325 }, 3326 { 3327 "PTR_TO_STACK check low 3", 3328 .insns = { 3329 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3330 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), 3331 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3332 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3333 BPF_EXIT_INSN(), 3334 }, 3335 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3336 .errstr = "invalid stack off=-513 size=1", 3337 .result = REJECT, 3338 }, 3339 { 3340 "PTR_TO_STACK check low 4", 3341 .insns = { 3342 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3343 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, INT_MIN), 3344 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3345 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3346 BPF_EXIT_INSN(), 3347 }, 3348 .result = REJECT, 3349 .errstr = "math between fp pointer", 3350 }, 3351 { 3352 "PTR_TO_STACK check low 5", 3353 .insns = { 3354 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3356 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3357 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3358 BPF_EXIT_INSN(), 3359 }, 3360 .result = REJECT, 3361 .errstr = "invalid stack off", 3362 }, 3363 { 3364 "PTR_TO_STACK check low 6", 3365 .insns = { 3366 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3367 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3368 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), 3369 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), 3370 BPF_EXIT_INSN(), 3371 }, 3372 .result = REJECT, 3373 .errstr = "invalid stack off", 3374 }, 3375 { 3376 "PTR_TO_STACK check low 7", 3377 .insns = { 3378 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3379 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3380 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), 3381 BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), 3382 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), 3383 BPF_EXIT_INSN(), 3384 }, 3385 .result = REJECT, 3386 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 3387 .errstr = "fp pointer offset", 3388 }, 3389 { 3390 "PTR_TO_STACK mixed reg/k, 1", 3391 .insns = { 3392 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3394 BPF_MOV64_IMM(BPF_REG_2, -3), 3395 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3396 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3397 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3398 BPF_EXIT_INSN(), 3399 }, 3400 .result = ACCEPT, 3401 .retval = 42, 3402 }, 3403 { 3404 "PTR_TO_STACK mixed reg/k, 2", 3405 .insns = { 3406 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 3407 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 3408 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3409 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3410 BPF_MOV64_IMM(BPF_REG_2, -3), 3411 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3412 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3413 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 3414 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_5, -6), 3415 BPF_EXIT_INSN(), 3416 }, 3417 .result = ACCEPT, 3418 .retval = 42, 3419 }, 3420 { 3421 "PTR_TO_STACK mixed reg/k, 3", 3422 .insns = { 3423 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3424 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), 3425 BPF_MOV64_IMM(BPF_REG_2, -3), 3426 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3427 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3428 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3429 BPF_EXIT_INSN(), 3430 }, 3431 .result = ACCEPT, 3432 .retval = -3, 3433 }, 3434 { 3435 "PTR_TO_STACK reg", 3436 .insns = { 3437 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 3438 BPF_MOV64_IMM(BPF_REG_2, -3), 3439 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 3440 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), 3441 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 3442 BPF_EXIT_INSN(), 3443 }, 3444 .result_unpriv = REJECT, 3445 .errstr_unpriv = "invalid stack off=0 size=1", 3446 .result = ACCEPT, 3447 .retval = 42, 3448 }, 3449 { 3450 "stack pointer arithmetic", 3451 .insns = { 3452 BPF_MOV64_IMM(BPF_REG_1, 4), 3453 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 3454 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 3455 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3456 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 3457 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3458 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 3459 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3460 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 3461 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3462 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 3463 BPF_MOV64_IMM(BPF_REG_0, 0), 3464 BPF_EXIT_INSN(), 3465 }, 3466 .result = ACCEPT, 3467 }, 3468 { 3469 "raw_stack: no skb_load_bytes", 3470 .insns = { 3471 BPF_MOV64_IMM(BPF_REG_2, 4), 3472 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3474 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3475 BPF_MOV64_IMM(BPF_REG_4, 8), 3476 /* Call to skb_load_bytes() omitted. */ 3477 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3478 BPF_EXIT_INSN(), 3479 }, 3480 .result = REJECT, 3481 .errstr = "invalid read from stack off -8+0 size 8", 3482 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3483 }, 3484 { 3485 "raw_stack: skb_load_bytes, negative len", 3486 .insns = { 3487 BPF_MOV64_IMM(BPF_REG_2, 4), 3488 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3489 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3490 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3491 BPF_MOV64_IMM(BPF_REG_4, -8), 3492 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3493 BPF_FUNC_skb_load_bytes), 3494 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3495 BPF_EXIT_INSN(), 3496 }, 3497 .result = REJECT, 3498 .errstr = "R4 min value is negative", 3499 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3500 }, 3501 { 3502 "raw_stack: skb_load_bytes, negative len 2", 3503 .insns = { 3504 BPF_MOV64_IMM(BPF_REG_2, 4), 3505 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3506 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3507 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3508 BPF_MOV64_IMM(BPF_REG_4, ~0), 3509 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3510 BPF_FUNC_skb_load_bytes), 3511 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3512 BPF_EXIT_INSN(), 3513 }, 3514 .result = REJECT, 3515 .errstr = "R4 min value is negative", 3516 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3517 }, 3518 { 3519 "raw_stack: skb_load_bytes, zero len", 3520 .insns = { 3521 BPF_MOV64_IMM(BPF_REG_2, 4), 3522 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3524 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3525 BPF_MOV64_IMM(BPF_REG_4, 0), 3526 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3527 BPF_FUNC_skb_load_bytes), 3528 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3529 BPF_EXIT_INSN(), 3530 }, 3531 .result = REJECT, 3532 .errstr = "invalid stack type R3", 3533 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3534 }, 3535 { 3536 "raw_stack: skb_load_bytes, no init", 3537 .insns = { 3538 BPF_MOV64_IMM(BPF_REG_2, 4), 3539 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3540 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3541 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3542 BPF_MOV64_IMM(BPF_REG_4, 8), 3543 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3544 BPF_FUNC_skb_load_bytes), 3545 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3546 BPF_EXIT_INSN(), 3547 }, 3548 .result = ACCEPT, 3549 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3550 }, 3551 { 3552 "raw_stack: skb_load_bytes, init", 3553 .insns = { 3554 BPF_MOV64_IMM(BPF_REG_2, 4), 3555 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3556 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3557 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe), 3558 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3559 BPF_MOV64_IMM(BPF_REG_4, 8), 3560 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3561 BPF_FUNC_skb_load_bytes), 3562 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3563 BPF_EXIT_INSN(), 3564 }, 3565 .result = ACCEPT, 3566 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3567 }, 3568 { 3569 "raw_stack: skb_load_bytes, spilled regs around bounds", 3570 .insns = { 3571 BPF_MOV64_IMM(BPF_REG_2, 4), 3572 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3573 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3574 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3575 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3576 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3577 BPF_MOV64_IMM(BPF_REG_4, 8), 3578 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3579 BPF_FUNC_skb_load_bytes), 3580 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3581 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3582 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3583 offsetof(struct __sk_buff, mark)), 3584 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3585 offsetof(struct __sk_buff, priority)), 3586 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3587 BPF_EXIT_INSN(), 3588 }, 3589 .result = ACCEPT, 3590 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3591 }, 3592 { 3593 "raw_stack: skb_load_bytes, spilled regs corruption", 3594 .insns = { 3595 BPF_MOV64_IMM(BPF_REG_2, 4), 3596 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3597 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 3598 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3599 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3600 BPF_MOV64_IMM(BPF_REG_4, 8), 3601 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3602 BPF_FUNC_skb_load_bytes), 3603 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3604 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3605 offsetof(struct __sk_buff, mark)), 3606 BPF_EXIT_INSN(), 3607 }, 3608 .result = REJECT, 3609 .errstr = "R0 invalid mem access 'inv'", 3610 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3611 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3612 }, 3613 { 3614 "raw_stack: skb_load_bytes, spilled regs corruption 2", 3615 .insns = { 3616 BPF_MOV64_IMM(BPF_REG_2, 4), 3617 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3618 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3619 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3620 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3621 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3622 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3623 BPF_MOV64_IMM(BPF_REG_4, 8), 3624 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3625 BPF_FUNC_skb_load_bytes), 3626 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3627 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3628 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3629 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3630 offsetof(struct __sk_buff, mark)), 3631 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3632 offsetof(struct __sk_buff, priority)), 3633 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3634 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3, 3635 offsetof(struct __sk_buff, pkt_type)), 3636 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3637 BPF_EXIT_INSN(), 3638 }, 3639 .result = REJECT, 3640 .errstr = "R3 invalid mem access 'inv'", 3641 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3642 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3643 }, 3644 { 3645 "raw_stack: skb_load_bytes, spilled regs + data", 3646 .insns = { 3647 BPF_MOV64_IMM(BPF_REG_2, 4), 3648 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3649 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 3650 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 3651 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 3652 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 3653 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3654 BPF_MOV64_IMM(BPF_REG_4, 8), 3655 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3656 BPF_FUNC_skb_load_bytes), 3657 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3658 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3659 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3660 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3661 offsetof(struct __sk_buff, mark)), 3662 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3663 offsetof(struct __sk_buff, priority)), 3664 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3665 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3666 BPF_EXIT_INSN(), 3667 }, 3668 .result = ACCEPT, 3669 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3670 }, 3671 { 3672 "raw_stack: skb_load_bytes, invalid access 1", 3673 .insns = { 3674 BPF_MOV64_IMM(BPF_REG_2, 4), 3675 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3676 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513), 3677 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3678 BPF_MOV64_IMM(BPF_REG_4, 8), 3679 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3680 BPF_FUNC_skb_load_bytes), 3681 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3682 BPF_EXIT_INSN(), 3683 }, 3684 .result = REJECT, 3685 .errstr = "invalid stack type R3 off=-513 access_size=8", 3686 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3687 }, 3688 { 3689 "raw_stack: skb_load_bytes, invalid access 2", 3690 .insns = { 3691 BPF_MOV64_IMM(BPF_REG_2, 4), 3692 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3693 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3694 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3695 BPF_MOV64_IMM(BPF_REG_4, 8), 3696 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3697 BPF_FUNC_skb_load_bytes), 3698 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3699 BPF_EXIT_INSN(), 3700 }, 3701 .result = REJECT, 3702 .errstr = "invalid stack type R3 off=-1 access_size=8", 3703 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3704 }, 3705 { 3706 "raw_stack: skb_load_bytes, invalid access 3", 3707 .insns = { 3708 BPF_MOV64_IMM(BPF_REG_2, 4), 3709 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3710 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff), 3711 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3712 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3713 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3714 BPF_FUNC_skb_load_bytes), 3715 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3716 BPF_EXIT_INSN(), 3717 }, 3718 .result = REJECT, 3719 .errstr = "R4 min value is negative", 3720 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3721 }, 3722 { 3723 "raw_stack: skb_load_bytes, invalid access 4", 3724 .insns = { 3725 BPF_MOV64_IMM(BPF_REG_2, 4), 3726 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3728 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3729 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3730 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3731 BPF_FUNC_skb_load_bytes), 3732 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3733 BPF_EXIT_INSN(), 3734 }, 3735 .result = REJECT, 3736 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3737 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3738 }, 3739 { 3740 "raw_stack: skb_load_bytes, invalid access 5", 3741 .insns = { 3742 BPF_MOV64_IMM(BPF_REG_2, 4), 3743 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3745 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3746 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3747 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3748 BPF_FUNC_skb_load_bytes), 3749 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3750 BPF_EXIT_INSN(), 3751 }, 3752 .result = REJECT, 3753 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3754 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3755 }, 3756 { 3757 "raw_stack: skb_load_bytes, invalid access 6", 3758 .insns = { 3759 BPF_MOV64_IMM(BPF_REG_2, 4), 3760 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3762 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3763 BPF_MOV64_IMM(BPF_REG_4, 0), 3764 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3765 BPF_FUNC_skb_load_bytes), 3766 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3767 BPF_EXIT_INSN(), 3768 }, 3769 .result = REJECT, 3770 .errstr = "invalid stack type R3 off=-512 access_size=0", 3771 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3772 }, 3773 { 3774 "raw_stack: skb_load_bytes, large access", 3775 .insns = { 3776 BPF_MOV64_IMM(BPF_REG_2, 4), 3777 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3778 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3779 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3780 BPF_MOV64_IMM(BPF_REG_4, 512), 3781 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3782 BPF_FUNC_skb_load_bytes), 3783 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3784 BPF_EXIT_INSN(), 3785 }, 3786 .result = ACCEPT, 3787 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3788 }, 3789 { 3790 "context stores via ST", 3791 .insns = { 3792 BPF_MOV64_IMM(BPF_REG_0, 0), 3793 BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0), 3794 BPF_EXIT_INSN(), 3795 }, 3796 .errstr = "BPF_ST stores into R1 ctx is not allowed", 3797 .result = REJECT, 3798 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3799 }, 3800 { 3801 "context stores via XADD", 3802 .insns = { 3803 BPF_MOV64_IMM(BPF_REG_0, 0), 3804 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1, 3805 BPF_REG_0, offsetof(struct __sk_buff, mark), 0), 3806 BPF_EXIT_INSN(), 3807 }, 3808 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 3809 .result = REJECT, 3810 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3811 }, 3812 { 3813 "direct packet access: test1", 3814 .insns = { 3815 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3816 offsetof(struct __sk_buff, data)), 3817 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3818 offsetof(struct __sk_buff, data_end)), 3819 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3820 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3821 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3822 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3823 BPF_MOV64_IMM(BPF_REG_0, 0), 3824 BPF_EXIT_INSN(), 3825 }, 3826 .result = ACCEPT, 3827 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3828 }, 3829 { 3830 "direct packet access: test2", 3831 .insns = { 3832 BPF_MOV64_IMM(BPF_REG_0, 1), 3833 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 3834 offsetof(struct __sk_buff, data_end)), 3835 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3836 offsetof(struct __sk_buff, data)), 3837 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3838 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14), 3839 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15), 3840 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7), 3841 BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12), 3842 BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14), 3843 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3844 offsetof(struct __sk_buff, data)), 3845 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), 3846 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3847 offsetof(struct __sk_buff, len)), 3848 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), 3849 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), 3850 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), 3851 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 3852 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3853 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 3854 offsetof(struct __sk_buff, data_end)), 3855 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 3856 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4), 3857 BPF_MOV64_IMM(BPF_REG_0, 0), 3858 BPF_EXIT_INSN(), 3859 }, 3860 .result = ACCEPT, 3861 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3862 }, 3863 { 3864 "direct packet access: test3", 3865 .insns = { 3866 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3867 offsetof(struct __sk_buff, data)), 3868 BPF_MOV64_IMM(BPF_REG_0, 0), 3869 BPF_EXIT_INSN(), 3870 }, 3871 .errstr = "invalid bpf_context access off=76", 3872 .result = REJECT, 3873 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 3874 }, 3875 { 3876 "direct packet access: test4 (write)", 3877 .insns = { 3878 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3879 offsetof(struct __sk_buff, data)), 3880 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3881 offsetof(struct __sk_buff, data_end)), 3882 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3883 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3884 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3885 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3886 BPF_MOV64_IMM(BPF_REG_0, 0), 3887 BPF_EXIT_INSN(), 3888 }, 3889 .result = ACCEPT, 3890 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3891 }, 3892 { 3893 "direct packet access: test5 (pkt_end >= reg, good access)", 3894 .insns = { 3895 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3896 offsetof(struct __sk_buff, data)), 3897 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3898 offsetof(struct __sk_buff, data_end)), 3899 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3901 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3902 BPF_MOV64_IMM(BPF_REG_0, 1), 3903 BPF_EXIT_INSN(), 3904 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3905 BPF_MOV64_IMM(BPF_REG_0, 0), 3906 BPF_EXIT_INSN(), 3907 }, 3908 .result = ACCEPT, 3909 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3910 }, 3911 { 3912 "direct packet access: test6 (pkt_end >= reg, bad access)", 3913 .insns = { 3914 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3915 offsetof(struct __sk_buff, data)), 3916 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3917 offsetof(struct __sk_buff, data_end)), 3918 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3919 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3920 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3921 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3922 BPF_MOV64_IMM(BPF_REG_0, 1), 3923 BPF_EXIT_INSN(), 3924 BPF_MOV64_IMM(BPF_REG_0, 0), 3925 BPF_EXIT_INSN(), 3926 }, 3927 .errstr = "invalid access to packet", 3928 .result = REJECT, 3929 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3930 }, 3931 { 3932 "direct packet access: test7 (pkt_end >= reg, both accesses)", 3933 .insns = { 3934 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3935 offsetof(struct __sk_buff, data)), 3936 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3937 offsetof(struct __sk_buff, data_end)), 3938 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3939 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3940 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3941 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3942 BPF_MOV64_IMM(BPF_REG_0, 1), 3943 BPF_EXIT_INSN(), 3944 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3945 BPF_MOV64_IMM(BPF_REG_0, 0), 3946 BPF_EXIT_INSN(), 3947 }, 3948 .errstr = "invalid access to packet", 3949 .result = REJECT, 3950 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3951 }, 3952 { 3953 "direct packet access: test8 (double test, variant 1)", 3954 .insns = { 3955 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3956 offsetof(struct __sk_buff, data)), 3957 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3958 offsetof(struct __sk_buff, data_end)), 3959 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3960 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3961 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4), 3962 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3963 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3964 BPF_MOV64_IMM(BPF_REG_0, 1), 3965 BPF_EXIT_INSN(), 3966 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3967 BPF_MOV64_IMM(BPF_REG_0, 0), 3968 BPF_EXIT_INSN(), 3969 }, 3970 .result = ACCEPT, 3971 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3972 }, 3973 { 3974 "direct packet access: test9 (double test, variant 2)", 3975 .insns = { 3976 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3977 offsetof(struct __sk_buff, data)), 3978 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3979 offsetof(struct __sk_buff, data_end)), 3980 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3982 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3983 BPF_MOV64_IMM(BPF_REG_0, 1), 3984 BPF_EXIT_INSN(), 3985 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3986 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3987 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3988 BPF_MOV64_IMM(BPF_REG_0, 0), 3989 BPF_EXIT_INSN(), 3990 }, 3991 .result = ACCEPT, 3992 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3993 }, 3994 { 3995 "direct packet access: test10 (write invalid)", 3996 .insns = { 3997 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3998 offsetof(struct __sk_buff, data)), 3999 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4000 offsetof(struct __sk_buff, data_end)), 4001 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4002 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4003 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 4004 BPF_MOV64_IMM(BPF_REG_0, 0), 4005 BPF_EXIT_INSN(), 4006 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4007 BPF_MOV64_IMM(BPF_REG_0, 0), 4008 BPF_EXIT_INSN(), 4009 }, 4010 .errstr = "invalid access to packet", 4011 .result = REJECT, 4012 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4013 }, 4014 { 4015 "direct packet access: test11 (shift, good access)", 4016 .insns = { 4017 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4018 offsetof(struct __sk_buff, data)), 4019 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4020 offsetof(struct __sk_buff, data_end)), 4021 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4022 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4023 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4024 BPF_MOV64_IMM(BPF_REG_3, 144), 4025 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4026 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4027 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3), 4028 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4029 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4030 BPF_MOV64_IMM(BPF_REG_0, 1), 4031 BPF_EXIT_INSN(), 4032 BPF_MOV64_IMM(BPF_REG_0, 0), 4033 BPF_EXIT_INSN(), 4034 }, 4035 .result = ACCEPT, 4036 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4037 .retval = 1, 4038 }, 4039 { 4040 "direct packet access: test12 (and, good access)", 4041 .insns = { 4042 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4043 offsetof(struct __sk_buff, data)), 4044 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4045 offsetof(struct __sk_buff, data_end)), 4046 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4047 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4048 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4049 BPF_MOV64_IMM(BPF_REG_3, 144), 4050 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4051 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4052 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 4053 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4054 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4055 BPF_MOV64_IMM(BPF_REG_0, 1), 4056 BPF_EXIT_INSN(), 4057 BPF_MOV64_IMM(BPF_REG_0, 0), 4058 BPF_EXIT_INSN(), 4059 }, 4060 .result = ACCEPT, 4061 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4062 .retval = 1, 4063 }, 4064 { 4065 "direct packet access: test13 (branches, good access)", 4066 .insns = { 4067 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4068 offsetof(struct __sk_buff, data)), 4069 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4070 offsetof(struct __sk_buff, data_end)), 4071 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4072 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4073 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13), 4074 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4075 offsetof(struct __sk_buff, mark)), 4076 BPF_MOV64_IMM(BPF_REG_4, 1), 4077 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2), 4078 BPF_MOV64_IMM(BPF_REG_3, 14), 4079 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 4080 BPF_MOV64_IMM(BPF_REG_3, 24), 4081 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 4082 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 4083 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 4084 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4085 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4086 BPF_MOV64_IMM(BPF_REG_0, 1), 4087 BPF_EXIT_INSN(), 4088 BPF_MOV64_IMM(BPF_REG_0, 0), 4089 BPF_EXIT_INSN(), 4090 }, 4091 .result = ACCEPT, 4092 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4093 .retval = 1, 4094 }, 4095 { 4096 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)", 4097 .insns = { 4098 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4099 offsetof(struct __sk_buff, data)), 4100 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4101 offsetof(struct __sk_buff, data_end)), 4102 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4103 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 4104 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 4105 BPF_MOV64_IMM(BPF_REG_5, 12), 4106 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4), 4107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 4108 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 4109 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 4110 BPF_MOV64_IMM(BPF_REG_0, 1), 4111 BPF_EXIT_INSN(), 4112 BPF_MOV64_IMM(BPF_REG_0, 0), 4113 BPF_EXIT_INSN(), 4114 }, 4115 .result = ACCEPT, 4116 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4117 .retval = 1, 4118 }, 4119 { 4120 "direct packet access: test15 (spill with xadd)", 4121 .insns = { 4122 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4123 offsetof(struct __sk_buff, data)), 4124 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4125 offsetof(struct __sk_buff, data_end)), 4126 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4127 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4128 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 4129 BPF_MOV64_IMM(BPF_REG_5, 4096), 4130 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 4131 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 4132 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 4133 BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 4134 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 4135 BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0), 4136 BPF_MOV64_IMM(BPF_REG_0, 0), 4137 BPF_EXIT_INSN(), 4138 }, 4139 .errstr = "R2 invalid mem access 'inv'", 4140 .result = REJECT, 4141 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4142 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4143 }, 4144 { 4145 "direct packet access: test16 (arith on data_end)", 4146 .insns = { 4147 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4148 offsetof(struct __sk_buff, data)), 4149 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4150 offsetof(struct __sk_buff, data_end)), 4151 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4152 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4153 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16), 4154 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4155 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4156 BPF_MOV64_IMM(BPF_REG_0, 0), 4157 BPF_EXIT_INSN(), 4158 }, 4159 .errstr = "R3 pointer arithmetic on pkt_end", 4160 .result = REJECT, 4161 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4162 }, 4163 { 4164 "direct packet access: test17 (pruning, alignment)", 4165 .insns = { 4166 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4167 offsetof(struct __sk_buff, data)), 4168 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4169 offsetof(struct __sk_buff, data_end)), 4170 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4171 offsetof(struct __sk_buff, mark)), 4172 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4173 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14), 4174 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4), 4175 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4176 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4), 4177 BPF_MOV64_IMM(BPF_REG_0, 0), 4178 BPF_EXIT_INSN(), 4179 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 4180 BPF_JMP_A(-6), 4181 }, 4182 .errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4", 4183 .result = REJECT, 4184 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4185 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 4186 }, 4187 { 4188 "direct packet access: test18 (imm += pkt_ptr, 1)", 4189 .insns = { 4190 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4191 offsetof(struct __sk_buff, data)), 4192 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4193 offsetof(struct __sk_buff, data_end)), 4194 BPF_MOV64_IMM(BPF_REG_0, 8), 4195 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4196 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4197 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4198 BPF_MOV64_IMM(BPF_REG_0, 0), 4199 BPF_EXIT_INSN(), 4200 }, 4201 .result = ACCEPT, 4202 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4203 }, 4204 { 4205 "direct packet access: test19 (imm += pkt_ptr, 2)", 4206 .insns = { 4207 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4208 offsetof(struct __sk_buff, data)), 4209 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4210 offsetof(struct __sk_buff, data_end)), 4211 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4212 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4213 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 4214 BPF_MOV64_IMM(BPF_REG_4, 4), 4215 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4216 BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0), 4217 BPF_MOV64_IMM(BPF_REG_0, 0), 4218 BPF_EXIT_INSN(), 4219 }, 4220 .result = ACCEPT, 4221 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4222 }, 4223 { 4224 "direct packet access: test20 (x += pkt_ptr, 1)", 4225 .insns = { 4226 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4227 offsetof(struct __sk_buff, data)), 4228 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4229 offsetof(struct __sk_buff, data_end)), 4230 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4231 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4232 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4233 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff), 4234 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4235 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4236 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4237 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 4238 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 4239 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 4240 BPF_MOV64_IMM(BPF_REG_0, 0), 4241 BPF_EXIT_INSN(), 4242 }, 4243 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4244 .result = ACCEPT, 4245 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4246 }, 4247 { 4248 "direct packet access: test21 (x += pkt_ptr, 2)", 4249 .insns = { 4250 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4251 offsetof(struct __sk_buff, data)), 4252 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4253 offsetof(struct __sk_buff, data_end)), 4254 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4255 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4256 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 4257 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 4258 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 4259 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 4260 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff), 4261 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4262 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4263 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 4264 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 4265 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 4266 BPF_MOV64_IMM(BPF_REG_0, 0), 4267 BPF_EXIT_INSN(), 4268 }, 4269 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4270 .result = ACCEPT, 4271 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4272 }, 4273 { 4274 "direct packet access: test22 (x += pkt_ptr, 3)", 4275 .insns = { 4276 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4277 offsetof(struct __sk_buff, data)), 4278 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4279 offsetof(struct __sk_buff, data_end)), 4280 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4281 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4282 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), 4283 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16), 4284 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16), 4285 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11), 4286 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 4287 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 4288 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 4289 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 4290 BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49), 4291 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 4292 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 4293 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 4294 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 4295 BPF_MOV64_IMM(BPF_REG_2, 1), 4296 BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0), 4297 BPF_MOV64_IMM(BPF_REG_0, 0), 4298 BPF_EXIT_INSN(), 4299 }, 4300 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4301 .result = ACCEPT, 4302 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4303 }, 4304 { 4305 "direct packet access: test23 (x += pkt_ptr, 4)", 4306 .insns = { 4307 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4308 offsetof(struct __sk_buff, data)), 4309 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4310 offsetof(struct __sk_buff, data_end)), 4311 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4312 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4313 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4314 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), 4315 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4316 BPF_MOV64_IMM(BPF_REG_0, 31), 4317 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4318 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4319 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4320 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1), 4321 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4322 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4323 BPF_MOV64_IMM(BPF_REG_0, 0), 4324 BPF_EXIT_INSN(), 4325 }, 4326 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4327 .result = REJECT, 4328 .errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)", 4329 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4330 }, 4331 { 4332 "direct packet access: test24 (x += pkt_ptr, 5)", 4333 .insns = { 4334 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4335 offsetof(struct __sk_buff, data)), 4336 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4337 offsetof(struct __sk_buff, data_end)), 4338 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 4339 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 4340 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 4341 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff), 4342 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4343 BPF_MOV64_IMM(BPF_REG_0, 64), 4344 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 4345 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 4346 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 4347 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1), 4348 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4349 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 4350 BPF_MOV64_IMM(BPF_REG_0, 0), 4351 BPF_EXIT_INSN(), 4352 }, 4353 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4354 .result = ACCEPT, 4355 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4356 }, 4357 { 4358 "direct packet access: test25 (marking on <, good access)", 4359 .insns = { 4360 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4361 offsetof(struct __sk_buff, data)), 4362 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4363 offsetof(struct __sk_buff, data_end)), 4364 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4365 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4366 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2), 4367 BPF_MOV64_IMM(BPF_REG_0, 0), 4368 BPF_EXIT_INSN(), 4369 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4370 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4371 }, 4372 .result = ACCEPT, 4373 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4374 }, 4375 { 4376 "direct packet access: test26 (marking on <, bad access)", 4377 .insns = { 4378 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4379 offsetof(struct __sk_buff, data)), 4380 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4381 offsetof(struct __sk_buff, data_end)), 4382 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4383 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4384 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3), 4385 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4386 BPF_MOV64_IMM(BPF_REG_0, 0), 4387 BPF_EXIT_INSN(), 4388 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 4389 }, 4390 .result = REJECT, 4391 .errstr = "invalid access to packet", 4392 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4393 }, 4394 { 4395 "direct packet access: test27 (marking on <=, good access)", 4396 .insns = { 4397 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4398 offsetof(struct __sk_buff, data)), 4399 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4400 offsetof(struct __sk_buff, data_end)), 4401 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4402 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4403 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1), 4404 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4405 BPF_MOV64_IMM(BPF_REG_0, 1), 4406 BPF_EXIT_INSN(), 4407 }, 4408 .result = ACCEPT, 4409 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4410 .retval = 1, 4411 }, 4412 { 4413 "direct packet access: test28 (marking on <=, bad access)", 4414 .insns = { 4415 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4416 offsetof(struct __sk_buff, data)), 4417 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4418 offsetof(struct __sk_buff, data_end)), 4419 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4420 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4421 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2), 4422 BPF_MOV64_IMM(BPF_REG_0, 1), 4423 BPF_EXIT_INSN(), 4424 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4425 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 4426 }, 4427 .result = REJECT, 4428 .errstr = "invalid access to packet", 4429 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4430 }, 4431 { 4432 "helper access to packet: test1, valid packet_ptr range", 4433 .insns = { 4434 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4435 offsetof(struct xdp_md, data)), 4436 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4437 offsetof(struct xdp_md, data_end)), 4438 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4439 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4440 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4441 BPF_LD_MAP_FD(BPF_REG_1, 0), 4442 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4443 BPF_MOV64_IMM(BPF_REG_4, 0), 4444 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4445 BPF_FUNC_map_update_elem), 4446 BPF_MOV64_IMM(BPF_REG_0, 0), 4447 BPF_EXIT_INSN(), 4448 }, 4449 .fixup_map_hash_8b = { 5 }, 4450 .result_unpriv = ACCEPT, 4451 .result = ACCEPT, 4452 .prog_type = BPF_PROG_TYPE_XDP, 4453 }, 4454 { 4455 "helper access to packet: test2, unchecked packet_ptr", 4456 .insns = { 4457 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4458 offsetof(struct xdp_md, data)), 4459 BPF_LD_MAP_FD(BPF_REG_1, 0), 4460 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4461 BPF_FUNC_map_lookup_elem), 4462 BPF_MOV64_IMM(BPF_REG_0, 0), 4463 BPF_EXIT_INSN(), 4464 }, 4465 .fixup_map_hash_8b = { 1 }, 4466 .result = REJECT, 4467 .errstr = "invalid access to packet", 4468 .prog_type = BPF_PROG_TYPE_XDP, 4469 }, 4470 { 4471 "helper access to packet: test3, variable add", 4472 .insns = { 4473 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4474 offsetof(struct xdp_md, data)), 4475 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4476 offsetof(struct xdp_md, data_end)), 4477 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4478 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4479 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4480 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4481 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4482 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4483 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4484 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4485 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4486 BPF_LD_MAP_FD(BPF_REG_1, 0), 4487 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4488 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4489 BPF_FUNC_map_lookup_elem), 4490 BPF_MOV64_IMM(BPF_REG_0, 0), 4491 BPF_EXIT_INSN(), 4492 }, 4493 .fixup_map_hash_8b = { 11 }, 4494 .result = ACCEPT, 4495 .prog_type = BPF_PROG_TYPE_XDP, 4496 }, 4497 { 4498 "helper access to packet: test4, packet_ptr with bad range", 4499 .insns = { 4500 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4501 offsetof(struct xdp_md, data)), 4502 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4503 offsetof(struct xdp_md, data_end)), 4504 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4505 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4506 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4507 BPF_MOV64_IMM(BPF_REG_0, 0), 4508 BPF_EXIT_INSN(), 4509 BPF_LD_MAP_FD(BPF_REG_1, 0), 4510 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4511 BPF_FUNC_map_lookup_elem), 4512 BPF_MOV64_IMM(BPF_REG_0, 0), 4513 BPF_EXIT_INSN(), 4514 }, 4515 .fixup_map_hash_8b = { 7 }, 4516 .result = REJECT, 4517 .errstr = "invalid access to packet", 4518 .prog_type = BPF_PROG_TYPE_XDP, 4519 }, 4520 { 4521 "helper access to packet: test5, packet_ptr with too short range", 4522 .insns = { 4523 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4524 offsetof(struct xdp_md, data)), 4525 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4526 offsetof(struct xdp_md, data_end)), 4527 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4528 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4529 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4530 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4531 BPF_LD_MAP_FD(BPF_REG_1, 0), 4532 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4533 BPF_FUNC_map_lookup_elem), 4534 BPF_MOV64_IMM(BPF_REG_0, 0), 4535 BPF_EXIT_INSN(), 4536 }, 4537 .fixup_map_hash_8b = { 6 }, 4538 .result = REJECT, 4539 .errstr = "invalid access to packet", 4540 .prog_type = BPF_PROG_TYPE_XDP, 4541 }, 4542 { 4543 "helper access to packet: test6, cls valid packet_ptr range", 4544 .insns = { 4545 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4546 offsetof(struct __sk_buff, data)), 4547 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4548 offsetof(struct __sk_buff, data_end)), 4549 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4550 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 4551 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 4552 BPF_LD_MAP_FD(BPF_REG_1, 0), 4553 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 4554 BPF_MOV64_IMM(BPF_REG_4, 0), 4555 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4556 BPF_FUNC_map_update_elem), 4557 BPF_MOV64_IMM(BPF_REG_0, 0), 4558 BPF_EXIT_INSN(), 4559 }, 4560 .fixup_map_hash_8b = { 5 }, 4561 .result = ACCEPT, 4562 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4563 }, 4564 { 4565 "helper access to packet: test7, cls unchecked packet_ptr", 4566 .insns = { 4567 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4568 offsetof(struct __sk_buff, data)), 4569 BPF_LD_MAP_FD(BPF_REG_1, 0), 4570 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4571 BPF_FUNC_map_lookup_elem), 4572 BPF_MOV64_IMM(BPF_REG_0, 0), 4573 BPF_EXIT_INSN(), 4574 }, 4575 .fixup_map_hash_8b = { 1 }, 4576 .result = REJECT, 4577 .errstr = "invalid access to packet", 4578 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4579 }, 4580 { 4581 "helper access to packet: test8, cls variable add", 4582 .insns = { 4583 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4584 offsetof(struct __sk_buff, data)), 4585 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4586 offsetof(struct __sk_buff, data_end)), 4587 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4588 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 4589 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 4590 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 4591 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4592 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 4593 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 4594 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 4595 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 4596 BPF_LD_MAP_FD(BPF_REG_1, 0), 4597 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 4598 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4599 BPF_FUNC_map_lookup_elem), 4600 BPF_MOV64_IMM(BPF_REG_0, 0), 4601 BPF_EXIT_INSN(), 4602 }, 4603 .fixup_map_hash_8b = { 11 }, 4604 .result = ACCEPT, 4605 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4606 }, 4607 { 4608 "helper access to packet: test9, cls packet_ptr with bad range", 4609 .insns = { 4610 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4611 offsetof(struct __sk_buff, data)), 4612 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4613 offsetof(struct __sk_buff, data_end)), 4614 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4615 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 4616 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 4617 BPF_MOV64_IMM(BPF_REG_0, 0), 4618 BPF_EXIT_INSN(), 4619 BPF_LD_MAP_FD(BPF_REG_1, 0), 4620 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4621 BPF_FUNC_map_lookup_elem), 4622 BPF_MOV64_IMM(BPF_REG_0, 0), 4623 BPF_EXIT_INSN(), 4624 }, 4625 .fixup_map_hash_8b = { 7 }, 4626 .result = REJECT, 4627 .errstr = "invalid access to packet", 4628 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4629 }, 4630 { 4631 "helper access to packet: test10, cls packet_ptr with too short range", 4632 .insns = { 4633 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4634 offsetof(struct __sk_buff, data)), 4635 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4636 offsetof(struct __sk_buff, data_end)), 4637 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 4638 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 4639 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 4640 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 4641 BPF_LD_MAP_FD(BPF_REG_1, 0), 4642 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4643 BPF_FUNC_map_lookup_elem), 4644 BPF_MOV64_IMM(BPF_REG_0, 0), 4645 BPF_EXIT_INSN(), 4646 }, 4647 .fixup_map_hash_8b = { 6 }, 4648 .result = REJECT, 4649 .errstr = "invalid access to packet", 4650 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4651 }, 4652 { 4653 "helper access to packet: test11, cls unsuitable helper 1", 4654 .insns = { 4655 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4656 offsetof(struct __sk_buff, data)), 4657 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4658 offsetof(struct __sk_buff, data_end)), 4659 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4660 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4661 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7), 4662 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4), 4663 BPF_MOV64_IMM(BPF_REG_2, 0), 4664 BPF_MOV64_IMM(BPF_REG_4, 42), 4665 BPF_MOV64_IMM(BPF_REG_5, 0), 4666 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4667 BPF_FUNC_skb_store_bytes), 4668 BPF_MOV64_IMM(BPF_REG_0, 0), 4669 BPF_EXIT_INSN(), 4670 }, 4671 .result = REJECT, 4672 .errstr = "helper access to the packet", 4673 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4674 }, 4675 { 4676 "helper access to packet: test12, cls unsuitable helper 2", 4677 .insns = { 4678 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4679 offsetof(struct __sk_buff, data)), 4680 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4681 offsetof(struct __sk_buff, data_end)), 4682 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4683 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 4684 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3), 4685 BPF_MOV64_IMM(BPF_REG_2, 0), 4686 BPF_MOV64_IMM(BPF_REG_4, 4), 4687 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4688 BPF_FUNC_skb_load_bytes), 4689 BPF_MOV64_IMM(BPF_REG_0, 0), 4690 BPF_EXIT_INSN(), 4691 }, 4692 .result = REJECT, 4693 .errstr = "helper access to the packet", 4694 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4695 }, 4696 { 4697 "helper access to packet: test13, cls helper ok", 4698 .insns = { 4699 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4700 offsetof(struct __sk_buff, data)), 4701 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4702 offsetof(struct __sk_buff, data_end)), 4703 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4704 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4705 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4706 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4708 BPF_MOV64_IMM(BPF_REG_2, 4), 4709 BPF_MOV64_IMM(BPF_REG_3, 0), 4710 BPF_MOV64_IMM(BPF_REG_4, 0), 4711 BPF_MOV64_IMM(BPF_REG_5, 0), 4712 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4713 BPF_FUNC_csum_diff), 4714 BPF_MOV64_IMM(BPF_REG_0, 0), 4715 BPF_EXIT_INSN(), 4716 }, 4717 .result = ACCEPT, 4718 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4719 }, 4720 { 4721 "helper access to packet: test14, cls helper ok sub", 4722 .insns = { 4723 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4724 offsetof(struct __sk_buff, data)), 4725 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4726 offsetof(struct __sk_buff, data_end)), 4727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4728 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4729 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4730 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4731 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4), 4732 BPF_MOV64_IMM(BPF_REG_2, 4), 4733 BPF_MOV64_IMM(BPF_REG_3, 0), 4734 BPF_MOV64_IMM(BPF_REG_4, 0), 4735 BPF_MOV64_IMM(BPF_REG_5, 0), 4736 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4737 BPF_FUNC_csum_diff), 4738 BPF_MOV64_IMM(BPF_REG_0, 0), 4739 BPF_EXIT_INSN(), 4740 }, 4741 .result = ACCEPT, 4742 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4743 }, 4744 { 4745 "helper access to packet: test15, cls helper fail sub", 4746 .insns = { 4747 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4748 offsetof(struct __sk_buff, data)), 4749 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4750 offsetof(struct __sk_buff, data_end)), 4751 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4752 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4753 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4754 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4755 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 12), 4756 BPF_MOV64_IMM(BPF_REG_2, 4), 4757 BPF_MOV64_IMM(BPF_REG_3, 0), 4758 BPF_MOV64_IMM(BPF_REG_4, 0), 4759 BPF_MOV64_IMM(BPF_REG_5, 0), 4760 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4761 BPF_FUNC_csum_diff), 4762 BPF_MOV64_IMM(BPF_REG_0, 0), 4763 BPF_EXIT_INSN(), 4764 }, 4765 .result = REJECT, 4766 .errstr = "invalid access to packet", 4767 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4768 }, 4769 { 4770 "helper access to packet: test16, cls helper fail range 1", 4771 .insns = { 4772 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4773 offsetof(struct __sk_buff, data)), 4774 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4775 offsetof(struct __sk_buff, data_end)), 4776 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4777 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4778 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4779 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4780 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4781 BPF_MOV64_IMM(BPF_REG_2, 8), 4782 BPF_MOV64_IMM(BPF_REG_3, 0), 4783 BPF_MOV64_IMM(BPF_REG_4, 0), 4784 BPF_MOV64_IMM(BPF_REG_5, 0), 4785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4786 BPF_FUNC_csum_diff), 4787 BPF_MOV64_IMM(BPF_REG_0, 0), 4788 BPF_EXIT_INSN(), 4789 }, 4790 .result = REJECT, 4791 .errstr = "invalid access to packet", 4792 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4793 }, 4794 { 4795 "helper access to packet: test17, cls helper fail range 2", 4796 .insns = { 4797 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4798 offsetof(struct __sk_buff, data)), 4799 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4800 offsetof(struct __sk_buff, data_end)), 4801 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4802 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4803 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4804 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4805 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4806 BPF_MOV64_IMM(BPF_REG_2, -9), 4807 BPF_MOV64_IMM(BPF_REG_3, 0), 4808 BPF_MOV64_IMM(BPF_REG_4, 0), 4809 BPF_MOV64_IMM(BPF_REG_5, 0), 4810 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4811 BPF_FUNC_csum_diff), 4812 BPF_MOV64_IMM(BPF_REG_0, 0), 4813 BPF_EXIT_INSN(), 4814 }, 4815 .result = REJECT, 4816 .errstr = "R2 min value is negative", 4817 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4818 }, 4819 { 4820 "helper access to packet: test18, cls helper fail range 3", 4821 .insns = { 4822 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4823 offsetof(struct __sk_buff, data)), 4824 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4825 offsetof(struct __sk_buff, data_end)), 4826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4827 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4828 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4829 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4830 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4831 BPF_MOV64_IMM(BPF_REG_2, ~0), 4832 BPF_MOV64_IMM(BPF_REG_3, 0), 4833 BPF_MOV64_IMM(BPF_REG_4, 0), 4834 BPF_MOV64_IMM(BPF_REG_5, 0), 4835 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4836 BPF_FUNC_csum_diff), 4837 BPF_MOV64_IMM(BPF_REG_0, 0), 4838 BPF_EXIT_INSN(), 4839 }, 4840 .result = REJECT, 4841 .errstr = "R2 min value is negative", 4842 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4843 }, 4844 { 4845 "helper access to packet: test19, cls helper range zero", 4846 .insns = { 4847 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4848 offsetof(struct __sk_buff, data)), 4849 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4850 offsetof(struct __sk_buff, data_end)), 4851 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4852 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4853 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4854 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4855 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4856 BPF_MOV64_IMM(BPF_REG_2, 0), 4857 BPF_MOV64_IMM(BPF_REG_3, 0), 4858 BPF_MOV64_IMM(BPF_REG_4, 0), 4859 BPF_MOV64_IMM(BPF_REG_5, 0), 4860 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4861 BPF_FUNC_csum_diff), 4862 BPF_MOV64_IMM(BPF_REG_0, 0), 4863 BPF_EXIT_INSN(), 4864 }, 4865 .result = ACCEPT, 4866 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4867 }, 4868 { 4869 "helper access to packet: test20, pkt end as input", 4870 .insns = { 4871 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4872 offsetof(struct __sk_buff, data)), 4873 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4874 offsetof(struct __sk_buff, data_end)), 4875 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4876 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4878 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4879 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 4880 BPF_MOV64_IMM(BPF_REG_2, 4), 4881 BPF_MOV64_IMM(BPF_REG_3, 0), 4882 BPF_MOV64_IMM(BPF_REG_4, 0), 4883 BPF_MOV64_IMM(BPF_REG_5, 0), 4884 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4885 BPF_FUNC_csum_diff), 4886 BPF_MOV64_IMM(BPF_REG_0, 0), 4887 BPF_EXIT_INSN(), 4888 }, 4889 .result = REJECT, 4890 .errstr = "R1 type=pkt_end expected=fp", 4891 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4892 }, 4893 { 4894 "helper access to packet: test21, wrong reg", 4895 .insns = { 4896 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4897 offsetof(struct __sk_buff, data)), 4898 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4899 offsetof(struct __sk_buff, data_end)), 4900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4901 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4902 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4903 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4904 BPF_MOV64_IMM(BPF_REG_2, 4), 4905 BPF_MOV64_IMM(BPF_REG_3, 0), 4906 BPF_MOV64_IMM(BPF_REG_4, 0), 4907 BPF_MOV64_IMM(BPF_REG_5, 0), 4908 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4909 BPF_FUNC_csum_diff), 4910 BPF_MOV64_IMM(BPF_REG_0, 0), 4911 BPF_EXIT_INSN(), 4912 }, 4913 .result = REJECT, 4914 .errstr = "invalid access to packet", 4915 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4916 }, 4917 { 4918 "prevent map lookup in sockmap", 4919 .insns = { 4920 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4921 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4922 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4923 BPF_LD_MAP_FD(BPF_REG_1, 0), 4924 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4925 BPF_FUNC_map_lookup_elem), 4926 BPF_EXIT_INSN(), 4927 }, 4928 .fixup_map_sockmap = { 3 }, 4929 .result = REJECT, 4930 .errstr = "cannot pass map_type 15 into func bpf_map_lookup_elem", 4931 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4932 }, 4933 { 4934 "prevent map lookup in sockhash", 4935 .insns = { 4936 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4937 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4938 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4939 BPF_LD_MAP_FD(BPF_REG_1, 0), 4940 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4941 BPF_FUNC_map_lookup_elem), 4942 BPF_EXIT_INSN(), 4943 }, 4944 .fixup_map_sockhash = { 3 }, 4945 .result = REJECT, 4946 .errstr = "cannot pass map_type 18 into func bpf_map_lookup_elem", 4947 .prog_type = BPF_PROG_TYPE_SOCK_OPS, 4948 }, 4949 { 4950 "prevent map lookup in xskmap", 4951 .insns = { 4952 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4953 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4954 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4955 BPF_LD_MAP_FD(BPF_REG_1, 0), 4956 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4957 BPF_FUNC_map_lookup_elem), 4958 BPF_EXIT_INSN(), 4959 }, 4960 .fixup_map_xskmap = { 3 }, 4961 .result = REJECT, 4962 .errstr = "cannot pass map_type 17 into func bpf_map_lookup_elem", 4963 .prog_type = BPF_PROG_TYPE_XDP, 4964 }, 4965 { 4966 "prevent map lookup in stack trace", 4967 .insns = { 4968 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4969 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4970 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4971 BPF_LD_MAP_FD(BPF_REG_1, 0), 4972 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4973 BPF_FUNC_map_lookup_elem), 4974 BPF_EXIT_INSN(), 4975 }, 4976 .fixup_map_stacktrace = { 3 }, 4977 .result = REJECT, 4978 .errstr = "cannot pass map_type 7 into func bpf_map_lookup_elem", 4979 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 4980 }, 4981 { 4982 "prevent map lookup in prog array", 4983 .insns = { 4984 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4985 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4986 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4987 BPF_LD_MAP_FD(BPF_REG_1, 0), 4988 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4989 BPF_FUNC_map_lookup_elem), 4990 BPF_EXIT_INSN(), 4991 }, 4992 .fixup_prog2 = { 3 }, 4993 .result = REJECT, 4994 .errstr = "cannot pass map_type 3 into func bpf_map_lookup_elem", 4995 }, 4996 { 4997 "valid map access into an array with a constant", 4998 .insns = { 4999 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5000 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5001 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5002 BPF_LD_MAP_FD(BPF_REG_1, 0), 5003 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5004 BPF_FUNC_map_lookup_elem), 5005 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5006 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5007 offsetof(struct test_val, foo)), 5008 BPF_EXIT_INSN(), 5009 }, 5010 .fixup_map_hash_48b = { 3 }, 5011 .errstr_unpriv = "R0 leaks addr", 5012 .result_unpriv = REJECT, 5013 .result = ACCEPT, 5014 }, 5015 { 5016 "valid map access into an array with a register", 5017 .insns = { 5018 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5019 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5020 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5021 BPF_LD_MAP_FD(BPF_REG_1, 0), 5022 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5023 BPF_FUNC_map_lookup_elem), 5024 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5025 BPF_MOV64_IMM(BPF_REG_1, 4), 5026 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5027 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5028 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5029 offsetof(struct test_val, foo)), 5030 BPF_EXIT_INSN(), 5031 }, 5032 .fixup_map_hash_48b = { 3 }, 5033 .errstr_unpriv = "R0 leaks addr", 5034 .result_unpriv = REJECT, 5035 .result = ACCEPT, 5036 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5037 }, 5038 { 5039 "valid map access into an array with a variable", 5040 .insns = { 5041 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5042 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5043 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5044 BPF_LD_MAP_FD(BPF_REG_1, 0), 5045 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5046 BPF_FUNC_map_lookup_elem), 5047 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5048 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5049 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3), 5050 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5051 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5052 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5053 offsetof(struct test_val, foo)), 5054 BPF_EXIT_INSN(), 5055 }, 5056 .fixup_map_hash_48b = { 3 }, 5057 .errstr_unpriv = "R0 leaks addr", 5058 .result_unpriv = REJECT, 5059 .result = ACCEPT, 5060 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5061 }, 5062 { 5063 "valid map access into an array with a signed variable", 5064 .insns = { 5065 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5066 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5067 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5068 BPF_LD_MAP_FD(BPF_REG_1, 0), 5069 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5070 BPF_FUNC_map_lookup_elem), 5071 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 5072 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5073 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1), 5074 BPF_MOV32_IMM(BPF_REG_1, 0), 5075 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 5076 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 5077 BPF_MOV32_IMM(BPF_REG_1, 0), 5078 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5079 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5080 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5081 offsetof(struct test_val, foo)), 5082 BPF_EXIT_INSN(), 5083 }, 5084 .fixup_map_hash_48b = { 3 }, 5085 .errstr_unpriv = "R0 leaks addr", 5086 .result_unpriv = REJECT, 5087 .result = ACCEPT, 5088 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5089 }, 5090 { 5091 "invalid map access into an array with a constant", 5092 .insns = { 5093 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5094 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5095 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5096 BPF_LD_MAP_FD(BPF_REG_1, 0), 5097 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5098 BPF_FUNC_map_lookup_elem), 5099 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5100 BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2, 5101 offsetof(struct test_val, foo)), 5102 BPF_EXIT_INSN(), 5103 }, 5104 .fixup_map_hash_48b = { 3 }, 5105 .errstr = "invalid access to map value, value_size=48 off=48 size=8", 5106 .result = REJECT, 5107 }, 5108 { 5109 "invalid map access into an array with a register", 5110 .insns = { 5111 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5112 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5113 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5114 BPF_LD_MAP_FD(BPF_REG_1, 0), 5115 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5116 BPF_FUNC_map_lookup_elem), 5117 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5118 BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1), 5119 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5120 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5121 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5122 offsetof(struct test_val, foo)), 5123 BPF_EXIT_INSN(), 5124 }, 5125 .fixup_map_hash_48b = { 3 }, 5126 .errstr = "R0 min value is outside of the array range", 5127 .result = REJECT, 5128 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5129 }, 5130 { 5131 "invalid map access into an array with a variable", 5132 .insns = { 5133 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5134 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5135 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5136 BPF_LD_MAP_FD(BPF_REG_1, 0), 5137 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5138 BPF_FUNC_map_lookup_elem), 5139 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5140 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5141 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5142 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5143 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5144 offsetof(struct test_val, foo)), 5145 BPF_EXIT_INSN(), 5146 }, 5147 .fixup_map_hash_48b = { 3 }, 5148 .errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map", 5149 .result = REJECT, 5150 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5151 }, 5152 { 5153 "invalid map access into an array with no floor check", 5154 .insns = { 5155 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5156 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5158 BPF_LD_MAP_FD(BPF_REG_1, 0), 5159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5160 BPF_FUNC_map_lookup_elem), 5161 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5162 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 5163 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 5164 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 5165 BPF_MOV32_IMM(BPF_REG_1, 0), 5166 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5167 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5168 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5169 offsetof(struct test_val, foo)), 5170 BPF_EXIT_INSN(), 5171 }, 5172 .fixup_map_hash_48b = { 3 }, 5173 .errstr_unpriv = "R0 leaks addr", 5174 .errstr = "R0 unbounded memory access", 5175 .result_unpriv = REJECT, 5176 .result = REJECT, 5177 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5178 }, 5179 { 5180 "invalid map access into an array with a invalid max check", 5181 .insns = { 5182 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5183 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5184 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5185 BPF_LD_MAP_FD(BPF_REG_1, 0), 5186 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5187 BPF_FUNC_map_lookup_elem), 5188 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5189 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5190 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1), 5191 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 5192 BPF_MOV32_IMM(BPF_REG_1, 0), 5193 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 5194 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5195 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 5196 offsetof(struct test_val, foo)), 5197 BPF_EXIT_INSN(), 5198 }, 5199 .fixup_map_hash_48b = { 3 }, 5200 .errstr_unpriv = "R0 leaks addr", 5201 .errstr = "invalid access to map value, value_size=48 off=44 size=8", 5202 .result_unpriv = REJECT, 5203 .result = REJECT, 5204 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5205 }, 5206 { 5207 "invalid map access into an array with a invalid max check", 5208 .insns = { 5209 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5210 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5212 BPF_LD_MAP_FD(BPF_REG_1, 0), 5213 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5214 BPF_FUNC_map_lookup_elem), 5215 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 5216 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 5217 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5218 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5219 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5220 BPF_LD_MAP_FD(BPF_REG_1, 0), 5221 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5222 BPF_FUNC_map_lookup_elem), 5223 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 5224 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 5225 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 5226 offsetof(struct test_val, foo)), 5227 BPF_EXIT_INSN(), 5228 }, 5229 .fixup_map_hash_48b = { 3, 11 }, 5230 .errstr = "R0 pointer += pointer", 5231 .result = REJECT, 5232 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5233 }, 5234 { 5235 "direct packet read test#1 for CGROUP_SKB", 5236 .insns = { 5237 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5238 offsetof(struct __sk_buff, data)), 5239 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5240 offsetof(struct __sk_buff, data_end)), 5241 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5242 offsetof(struct __sk_buff, len)), 5243 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5244 offsetof(struct __sk_buff, pkt_type)), 5245 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5246 offsetof(struct __sk_buff, mark)), 5247 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5248 offsetof(struct __sk_buff, mark)), 5249 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5250 offsetof(struct __sk_buff, queue_mapping)), 5251 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5252 offsetof(struct __sk_buff, protocol)), 5253 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5254 offsetof(struct __sk_buff, vlan_present)), 5255 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5257 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5258 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5259 BPF_MOV64_IMM(BPF_REG_0, 0), 5260 BPF_EXIT_INSN(), 5261 }, 5262 .result = ACCEPT, 5263 .result_unpriv = REJECT, 5264 .errstr_unpriv = "invalid bpf_context access off=76 size=4", 5265 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5266 }, 5267 { 5268 "direct packet read test#2 for CGROUP_SKB", 5269 .insns = { 5270 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5271 offsetof(struct __sk_buff, vlan_tci)), 5272 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5273 offsetof(struct __sk_buff, vlan_proto)), 5274 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5275 offsetof(struct __sk_buff, priority)), 5276 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5277 offsetof(struct __sk_buff, priority)), 5278 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5279 offsetof(struct __sk_buff, 5280 ingress_ifindex)), 5281 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5282 offsetof(struct __sk_buff, tc_index)), 5283 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5284 offsetof(struct __sk_buff, hash)), 5285 BPF_MOV64_IMM(BPF_REG_0, 0), 5286 BPF_EXIT_INSN(), 5287 }, 5288 .result = ACCEPT, 5289 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5290 }, 5291 { 5292 "direct packet read test#3 for CGROUP_SKB", 5293 .insns = { 5294 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5295 offsetof(struct __sk_buff, cb[0])), 5296 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5297 offsetof(struct __sk_buff, cb[1])), 5298 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5299 offsetof(struct __sk_buff, cb[2])), 5300 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5301 offsetof(struct __sk_buff, cb[3])), 5302 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5303 offsetof(struct __sk_buff, cb[4])), 5304 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5305 offsetof(struct __sk_buff, napi_id)), 5306 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_4, 5307 offsetof(struct __sk_buff, cb[0])), 5308 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_5, 5309 offsetof(struct __sk_buff, cb[1])), 5310 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 5311 offsetof(struct __sk_buff, cb[2])), 5312 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_7, 5313 offsetof(struct __sk_buff, cb[3])), 5314 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_8, 5315 offsetof(struct __sk_buff, cb[4])), 5316 BPF_MOV64_IMM(BPF_REG_0, 0), 5317 BPF_EXIT_INSN(), 5318 }, 5319 .result = ACCEPT, 5320 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5321 }, 5322 { 5323 "direct packet read test#4 for CGROUP_SKB", 5324 .insns = { 5325 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5326 offsetof(struct __sk_buff, family)), 5327 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5328 offsetof(struct __sk_buff, remote_ip4)), 5329 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 5330 offsetof(struct __sk_buff, local_ip4)), 5331 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5332 offsetof(struct __sk_buff, remote_ip6[0])), 5333 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5334 offsetof(struct __sk_buff, remote_ip6[1])), 5335 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5336 offsetof(struct __sk_buff, remote_ip6[2])), 5337 BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, 5338 offsetof(struct __sk_buff, remote_ip6[3])), 5339 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5340 offsetof(struct __sk_buff, local_ip6[0])), 5341 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5342 offsetof(struct __sk_buff, local_ip6[1])), 5343 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5344 offsetof(struct __sk_buff, local_ip6[2])), 5345 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 5346 offsetof(struct __sk_buff, local_ip6[3])), 5347 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 5348 offsetof(struct __sk_buff, remote_port)), 5349 BPF_LDX_MEM(BPF_W, BPF_REG_8, BPF_REG_1, 5350 offsetof(struct __sk_buff, local_port)), 5351 BPF_MOV64_IMM(BPF_REG_0, 0), 5352 BPF_EXIT_INSN(), 5353 }, 5354 .result = ACCEPT, 5355 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5356 }, 5357 { 5358 "invalid access of tc_classid for CGROUP_SKB", 5359 .insns = { 5360 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5361 offsetof(struct __sk_buff, tc_classid)), 5362 BPF_MOV64_IMM(BPF_REG_0, 0), 5363 BPF_EXIT_INSN(), 5364 }, 5365 .result = REJECT, 5366 .errstr = "invalid bpf_context access", 5367 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5368 }, 5369 { 5370 "invalid access of data_meta for CGROUP_SKB", 5371 .insns = { 5372 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5373 offsetof(struct __sk_buff, data_meta)), 5374 BPF_MOV64_IMM(BPF_REG_0, 0), 5375 BPF_EXIT_INSN(), 5376 }, 5377 .result = REJECT, 5378 .errstr = "invalid bpf_context access", 5379 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5380 }, 5381 { 5382 "invalid access of flow_keys for CGROUP_SKB", 5383 .insns = { 5384 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5385 offsetof(struct __sk_buff, flow_keys)), 5386 BPF_MOV64_IMM(BPF_REG_0, 0), 5387 BPF_EXIT_INSN(), 5388 }, 5389 .result = REJECT, 5390 .errstr = "invalid bpf_context access", 5391 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5392 }, 5393 { 5394 "invalid write access to napi_id for CGROUP_SKB", 5395 .insns = { 5396 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 5397 offsetof(struct __sk_buff, napi_id)), 5398 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_9, 5399 offsetof(struct __sk_buff, napi_id)), 5400 BPF_MOV64_IMM(BPF_REG_0, 0), 5401 BPF_EXIT_INSN(), 5402 }, 5403 .result = REJECT, 5404 .errstr = "invalid bpf_context access", 5405 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5406 }, 5407 { 5408 "valid cgroup storage access", 5409 .insns = { 5410 BPF_MOV64_IMM(BPF_REG_2, 0), 5411 BPF_LD_MAP_FD(BPF_REG_1, 0), 5412 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5413 BPF_FUNC_get_local_storage), 5414 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5415 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5416 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5417 BPF_EXIT_INSN(), 5418 }, 5419 .fixup_cgroup_storage = { 1 }, 5420 .result = ACCEPT, 5421 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5422 }, 5423 { 5424 "invalid cgroup storage access 1", 5425 .insns = { 5426 BPF_MOV64_IMM(BPF_REG_2, 0), 5427 BPF_LD_MAP_FD(BPF_REG_1, 0), 5428 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5429 BPF_FUNC_get_local_storage), 5430 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5431 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5432 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5433 BPF_EXIT_INSN(), 5434 }, 5435 .fixup_map_hash_8b = { 1 }, 5436 .result = REJECT, 5437 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5438 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5439 }, 5440 { 5441 "invalid cgroup storage access 2", 5442 .insns = { 5443 BPF_MOV64_IMM(BPF_REG_2, 0), 5444 BPF_LD_MAP_FD(BPF_REG_1, 1), 5445 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5446 BPF_FUNC_get_local_storage), 5447 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5448 BPF_EXIT_INSN(), 5449 }, 5450 .result = REJECT, 5451 .errstr = "fd 1 is not pointing to valid bpf_map", 5452 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5453 }, 5454 { 5455 "invalid cgroup storage access 3", 5456 .insns = { 5457 BPF_MOV64_IMM(BPF_REG_2, 0), 5458 BPF_LD_MAP_FD(BPF_REG_1, 0), 5459 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5460 BPF_FUNC_get_local_storage), 5461 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5462 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5463 BPF_MOV64_IMM(BPF_REG_0, 0), 5464 BPF_EXIT_INSN(), 5465 }, 5466 .fixup_cgroup_storage = { 1 }, 5467 .result = REJECT, 5468 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5469 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5470 }, 5471 { 5472 "invalid cgroup storage access 4", 5473 .insns = { 5474 BPF_MOV64_IMM(BPF_REG_2, 0), 5475 BPF_LD_MAP_FD(BPF_REG_1, 0), 5476 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5477 BPF_FUNC_get_local_storage), 5478 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5479 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5480 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5481 BPF_EXIT_INSN(), 5482 }, 5483 .fixup_cgroup_storage = { 1 }, 5484 .result = REJECT, 5485 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5486 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5487 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5488 }, 5489 { 5490 "invalid cgroup storage access 5", 5491 .insns = { 5492 BPF_MOV64_IMM(BPF_REG_2, 7), 5493 BPF_LD_MAP_FD(BPF_REG_1, 0), 5494 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5495 BPF_FUNC_get_local_storage), 5496 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5497 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5498 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5499 BPF_EXIT_INSN(), 5500 }, 5501 .fixup_cgroup_storage = { 1 }, 5502 .result = REJECT, 5503 .errstr = "get_local_storage() doesn't support non-zero flags", 5504 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5505 }, 5506 { 5507 "invalid cgroup storage access 6", 5508 .insns = { 5509 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5510 BPF_LD_MAP_FD(BPF_REG_1, 0), 5511 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5512 BPF_FUNC_get_local_storage), 5513 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5514 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5515 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5516 BPF_EXIT_INSN(), 5517 }, 5518 .fixup_cgroup_storage = { 1 }, 5519 .result = REJECT, 5520 .errstr = "get_local_storage() doesn't support non-zero flags", 5521 .errstr_unpriv = "R2 leaks addr into helper function", 5522 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5523 }, 5524 { 5525 "valid per-cpu cgroup storage access", 5526 .insns = { 5527 BPF_MOV64_IMM(BPF_REG_2, 0), 5528 BPF_LD_MAP_FD(BPF_REG_1, 0), 5529 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5530 BPF_FUNC_get_local_storage), 5531 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5532 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5533 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5534 BPF_EXIT_INSN(), 5535 }, 5536 .fixup_percpu_cgroup_storage = { 1 }, 5537 .result = ACCEPT, 5538 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5539 }, 5540 { 5541 "invalid per-cpu cgroup storage access 1", 5542 .insns = { 5543 BPF_MOV64_IMM(BPF_REG_2, 0), 5544 BPF_LD_MAP_FD(BPF_REG_1, 0), 5545 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5546 BPF_FUNC_get_local_storage), 5547 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5548 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5549 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5550 BPF_EXIT_INSN(), 5551 }, 5552 .fixup_map_hash_8b = { 1 }, 5553 .result = REJECT, 5554 .errstr = "cannot pass map_type 1 into func bpf_get_local_storage", 5555 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5556 }, 5557 { 5558 "invalid per-cpu cgroup storage access 2", 5559 .insns = { 5560 BPF_MOV64_IMM(BPF_REG_2, 0), 5561 BPF_LD_MAP_FD(BPF_REG_1, 1), 5562 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5563 BPF_FUNC_get_local_storage), 5564 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5565 BPF_EXIT_INSN(), 5566 }, 5567 .result = REJECT, 5568 .errstr = "fd 1 is not pointing to valid bpf_map", 5569 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5570 }, 5571 { 5572 "invalid per-cpu cgroup storage access 3", 5573 .insns = { 5574 BPF_MOV64_IMM(BPF_REG_2, 0), 5575 BPF_LD_MAP_FD(BPF_REG_1, 0), 5576 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5577 BPF_FUNC_get_local_storage), 5578 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 256), 5579 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5580 BPF_MOV64_IMM(BPF_REG_0, 0), 5581 BPF_EXIT_INSN(), 5582 }, 5583 .fixup_percpu_cgroup_storage = { 1 }, 5584 .result = REJECT, 5585 .errstr = "invalid access to map value, value_size=64 off=256 size=4", 5586 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5587 }, 5588 { 5589 "invalid per-cpu cgroup storage access 4", 5590 .insns = { 5591 BPF_MOV64_IMM(BPF_REG_2, 0), 5592 BPF_LD_MAP_FD(BPF_REG_1, 0), 5593 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5594 BPF_FUNC_get_local_storage), 5595 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -2), 5596 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5597 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5598 BPF_EXIT_INSN(), 5599 }, 5600 .fixup_cgroup_storage = { 1 }, 5601 .result = REJECT, 5602 .errstr = "invalid access to map value, value_size=64 off=-2 size=4", 5603 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5604 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5605 }, 5606 { 5607 "invalid per-cpu cgroup storage access 5", 5608 .insns = { 5609 BPF_MOV64_IMM(BPF_REG_2, 7), 5610 BPF_LD_MAP_FD(BPF_REG_1, 0), 5611 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5612 BPF_FUNC_get_local_storage), 5613 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5614 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5615 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5616 BPF_EXIT_INSN(), 5617 }, 5618 .fixup_percpu_cgroup_storage = { 1 }, 5619 .result = REJECT, 5620 .errstr = "get_local_storage() doesn't support non-zero flags", 5621 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5622 }, 5623 { 5624 "invalid per-cpu cgroup storage access 6", 5625 .insns = { 5626 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 5627 BPF_LD_MAP_FD(BPF_REG_1, 0), 5628 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5629 BPF_FUNC_get_local_storage), 5630 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5631 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 5632 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 5633 BPF_EXIT_INSN(), 5634 }, 5635 .fixup_percpu_cgroup_storage = { 1 }, 5636 .result = REJECT, 5637 .errstr = "get_local_storage() doesn't support non-zero flags", 5638 .errstr_unpriv = "R2 leaks addr into helper function", 5639 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5640 }, 5641 { 5642 "write tstamp from CGROUP_SKB", 5643 .insns = { 5644 BPF_MOV64_IMM(BPF_REG_0, 0), 5645 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 5646 offsetof(struct __sk_buff, tstamp)), 5647 BPF_MOV64_IMM(BPF_REG_0, 0), 5648 BPF_EXIT_INSN(), 5649 }, 5650 .result = ACCEPT, 5651 .result_unpriv = REJECT, 5652 .errstr_unpriv = "invalid bpf_context access off=152 size=8", 5653 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5654 }, 5655 { 5656 "read tstamp from CGROUP_SKB", 5657 .insns = { 5658 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 5659 offsetof(struct __sk_buff, tstamp)), 5660 BPF_MOV64_IMM(BPF_REG_0, 0), 5661 BPF_EXIT_INSN(), 5662 }, 5663 .result = ACCEPT, 5664 .prog_type = BPF_PROG_TYPE_CGROUP_SKB, 5665 }, 5666 { 5667 "multiple registers share map_lookup_elem result", 5668 .insns = { 5669 BPF_MOV64_IMM(BPF_REG_1, 10), 5670 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5671 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5672 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5673 BPF_LD_MAP_FD(BPF_REG_1, 0), 5674 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5675 BPF_FUNC_map_lookup_elem), 5676 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5677 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5678 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5679 BPF_EXIT_INSN(), 5680 }, 5681 .fixup_map_hash_8b = { 4 }, 5682 .result = ACCEPT, 5683 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5684 }, 5685 { 5686 "alu ops on ptr_to_map_value_or_null, 1", 5687 .insns = { 5688 BPF_MOV64_IMM(BPF_REG_1, 10), 5689 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5690 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5691 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5692 BPF_LD_MAP_FD(BPF_REG_1, 0), 5693 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5694 BPF_FUNC_map_lookup_elem), 5695 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5696 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2), 5697 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2), 5698 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5699 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5700 BPF_EXIT_INSN(), 5701 }, 5702 .fixup_map_hash_8b = { 4 }, 5703 .errstr = "R4 pointer arithmetic on map_value_or_null", 5704 .result = REJECT, 5705 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5706 }, 5707 { 5708 "alu ops on ptr_to_map_value_or_null, 2", 5709 .insns = { 5710 BPF_MOV64_IMM(BPF_REG_1, 10), 5711 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5712 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5713 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5714 BPF_LD_MAP_FD(BPF_REG_1, 0), 5715 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5716 BPF_FUNC_map_lookup_elem), 5717 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5718 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1), 5719 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5720 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5721 BPF_EXIT_INSN(), 5722 }, 5723 .fixup_map_hash_8b = { 4 }, 5724 .errstr = "R4 pointer arithmetic on map_value_or_null", 5725 .result = REJECT, 5726 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5727 }, 5728 { 5729 "alu ops on ptr_to_map_value_or_null, 3", 5730 .insns = { 5731 BPF_MOV64_IMM(BPF_REG_1, 10), 5732 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5733 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5734 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5735 BPF_LD_MAP_FD(BPF_REG_1, 0), 5736 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5737 BPF_FUNC_map_lookup_elem), 5738 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5739 BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1), 5740 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5741 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5742 BPF_EXIT_INSN(), 5743 }, 5744 .fixup_map_hash_8b = { 4 }, 5745 .errstr = "R4 pointer arithmetic on map_value_or_null", 5746 .result = REJECT, 5747 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5748 }, 5749 { 5750 "invalid memory access with multiple map_lookup_elem calls", 5751 .insns = { 5752 BPF_MOV64_IMM(BPF_REG_1, 10), 5753 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5754 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5755 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5756 BPF_LD_MAP_FD(BPF_REG_1, 0), 5757 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5758 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5759 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5760 BPF_FUNC_map_lookup_elem), 5761 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5762 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5763 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5764 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5765 BPF_FUNC_map_lookup_elem), 5766 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5767 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5768 BPF_EXIT_INSN(), 5769 }, 5770 .fixup_map_hash_8b = { 4 }, 5771 .result = REJECT, 5772 .errstr = "R4 !read_ok", 5773 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5774 }, 5775 { 5776 "valid indirect map_lookup_elem access with 2nd lookup in branch", 5777 .insns = { 5778 BPF_MOV64_IMM(BPF_REG_1, 10), 5779 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 5780 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5782 BPF_LD_MAP_FD(BPF_REG_1, 0), 5783 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 5784 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 5785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5786 BPF_FUNC_map_lookup_elem), 5787 BPF_MOV64_IMM(BPF_REG_2, 10), 5788 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3), 5789 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 5790 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 5791 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 5792 BPF_FUNC_map_lookup_elem), 5793 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 5794 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5795 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 5796 BPF_EXIT_INSN(), 5797 }, 5798 .fixup_map_hash_8b = { 4 }, 5799 .result = ACCEPT, 5800 .prog_type = BPF_PROG_TYPE_SCHED_CLS 5801 }, 5802 { 5803 "invalid map access from else condition", 5804 .insns = { 5805 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 5806 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5807 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5808 BPF_LD_MAP_FD(BPF_REG_1, 0), 5809 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 5810 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5811 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 5812 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1), 5813 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 5814 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 5815 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 5816 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)), 5817 BPF_EXIT_INSN(), 5818 }, 5819 .fixup_map_hash_48b = { 3 }, 5820 .errstr = "R0 unbounded memory access", 5821 .result = REJECT, 5822 .errstr_unpriv = "R0 leaks addr", 5823 .result_unpriv = REJECT, 5824 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 5825 }, 5826 { 5827 "constant register |= constant should keep constant type", 5828 .insns = { 5829 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5830 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5831 BPF_MOV64_IMM(BPF_REG_2, 34), 5832 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13), 5833 BPF_MOV64_IMM(BPF_REG_3, 0), 5834 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5835 BPF_EXIT_INSN(), 5836 }, 5837 .result = ACCEPT, 5838 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5839 }, 5840 { 5841 "constant register |= constant should not bypass stack boundary checks", 5842 .insns = { 5843 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5844 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5845 BPF_MOV64_IMM(BPF_REG_2, 34), 5846 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24), 5847 BPF_MOV64_IMM(BPF_REG_3, 0), 5848 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5849 BPF_EXIT_INSN(), 5850 }, 5851 .errstr = "invalid stack type R1 off=-48 access_size=58", 5852 .result = REJECT, 5853 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5854 }, 5855 { 5856 "constant register |= constant register should keep constant type", 5857 .insns = { 5858 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5860 BPF_MOV64_IMM(BPF_REG_2, 34), 5861 BPF_MOV64_IMM(BPF_REG_4, 13), 5862 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5863 BPF_MOV64_IMM(BPF_REG_3, 0), 5864 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5865 BPF_EXIT_INSN(), 5866 }, 5867 .result = ACCEPT, 5868 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5869 }, 5870 { 5871 "constant register |= constant register should not bypass stack boundary checks", 5872 .insns = { 5873 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5874 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 5875 BPF_MOV64_IMM(BPF_REG_2, 34), 5876 BPF_MOV64_IMM(BPF_REG_4, 24), 5877 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 5878 BPF_MOV64_IMM(BPF_REG_3, 0), 5879 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5880 BPF_EXIT_INSN(), 5881 }, 5882 .errstr = "invalid stack type R1 off=-48 access_size=58", 5883 .result = REJECT, 5884 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5885 }, 5886 { 5887 "invalid direct packet write for LWT_IN", 5888 .insns = { 5889 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5890 offsetof(struct __sk_buff, data)), 5891 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5892 offsetof(struct __sk_buff, data_end)), 5893 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5894 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5895 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5896 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5897 BPF_MOV64_IMM(BPF_REG_0, 0), 5898 BPF_EXIT_INSN(), 5899 }, 5900 .errstr = "cannot write into packet", 5901 .result = REJECT, 5902 .prog_type = BPF_PROG_TYPE_LWT_IN, 5903 }, 5904 { 5905 "invalid direct packet write for LWT_OUT", 5906 .insns = { 5907 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5908 offsetof(struct __sk_buff, data)), 5909 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5910 offsetof(struct __sk_buff, data_end)), 5911 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5912 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5913 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5914 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5915 BPF_MOV64_IMM(BPF_REG_0, 0), 5916 BPF_EXIT_INSN(), 5917 }, 5918 .errstr = "cannot write into packet", 5919 .result = REJECT, 5920 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5921 }, 5922 { 5923 "direct packet write for LWT_XMIT", 5924 .insns = { 5925 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5926 offsetof(struct __sk_buff, data)), 5927 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5928 offsetof(struct __sk_buff, data_end)), 5929 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5930 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5931 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5932 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 5933 BPF_MOV64_IMM(BPF_REG_0, 0), 5934 BPF_EXIT_INSN(), 5935 }, 5936 .result = ACCEPT, 5937 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5938 }, 5939 { 5940 "direct packet read for LWT_IN", 5941 .insns = { 5942 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5943 offsetof(struct __sk_buff, data)), 5944 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5945 offsetof(struct __sk_buff, data_end)), 5946 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5948 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5949 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5950 BPF_MOV64_IMM(BPF_REG_0, 0), 5951 BPF_EXIT_INSN(), 5952 }, 5953 .result = ACCEPT, 5954 .prog_type = BPF_PROG_TYPE_LWT_IN, 5955 }, 5956 { 5957 "direct packet read for LWT_OUT", 5958 .insns = { 5959 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5960 offsetof(struct __sk_buff, data)), 5961 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5962 offsetof(struct __sk_buff, data_end)), 5963 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5964 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5965 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5966 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5967 BPF_MOV64_IMM(BPF_REG_0, 0), 5968 BPF_EXIT_INSN(), 5969 }, 5970 .result = ACCEPT, 5971 .prog_type = BPF_PROG_TYPE_LWT_OUT, 5972 }, 5973 { 5974 "direct packet read for LWT_XMIT", 5975 .insns = { 5976 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5977 offsetof(struct __sk_buff, data)), 5978 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5979 offsetof(struct __sk_buff, data_end)), 5980 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5982 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 5983 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 5984 BPF_MOV64_IMM(BPF_REG_0, 0), 5985 BPF_EXIT_INSN(), 5986 }, 5987 .result = ACCEPT, 5988 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 5989 }, 5990 { 5991 "overlapping checks for direct packet access", 5992 .insns = { 5993 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 5994 offsetof(struct __sk_buff, data)), 5995 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 5996 offsetof(struct __sk_buff, data_end)), 5997 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 5998 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 5999 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 6000 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 6001 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 6002 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 6003 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 6004 BPF_MOV64_IMM(BPF_REG_0, 0), 6005 BPF_EXIT_INSN(), 6006 }, 6007 .result = ACCEPT, 6008 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 6009 }, 6010 { 6011 "make headroom for LWT_XMIT", 6012 .insns = { 6013 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6014 BPF_MOV64_IMM(BPF_REG_2, 34), 6015 BPF_MOV64_IMM(BPF_REG_3, 0), 6016 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 6017 /* split for s390 to succeed */ 6018 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 6019 BPF_MOV64_IMM(BPF_REG_2, 42), 6020 BPF_MOV64_IMM(BPF_REG_3, 0), 6021 BPF_EMIT_CALL(BPF_FUNC_skb_change_head), 6022 BPF_MOV64_IMM(BPF_REG_0, 0), 6023 BPF_EXIT_INSN(), 6024 }, 6025 .result = ACCEPT, 6026 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 6027 }, 6028 { 6029 "invalid access of tc_classid for LWT_IN", 6030 .insns = { 6031 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6032 offsetof(struct __sk_buff, tc_classid)), 6033 BPF_EXIT_INSN(), 6034 }, 6035 .result = REJECT, 6036 .errstr = "invalid bpf_context access", 6037 }, 6038 { 6039 "invalid access of tc_classid for LWT_OUT", 6040 .insns = { 6041 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6042 offsetof(struct __sk_buff, tc_classid)), 6043 BPF_EXIT_INSN(), 6044 }, 6045 .result = REJECT, 6046 .errstr = "invalid bpf_context access", 6047 }, 6048 { 6049 "invalid access of tc_classid for LWT_XMIT", 6050 .insns = { 6051 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6052 offsetof(struct __sk_buff, tc_classid)), 6053 BPF_EXIT_INSN(), 6054 }, 6055 .result = REJECT, 6056 .errstr = "invalid bpf_context access", 6057 }, 6058 { 6059 "leak pointer into ctx 1", 6060 .insns = { 6061 BPF_MOV64_IMM(BPF_REG_0, 0), 6062 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 6063 offsetof(struct __sk_buff, cb[0])), 6064 BPF_LD_MAP_FD(BPF_REG_2, 0), 6065 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_2, 6066 offsetof(struct __sk_buff, cb[0])), 6067 BPF_EXIT_INSN(), 6068 }, 6069 .fixup_map_hash_8b = { 2 }, 6070 .errstr_unpriv = "R2 leaks addr into mem", 6071 .result_unpriv = REJECT, 6072 .result = REJECT, 6073 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 6074 }, 6075 { 6076 "leak pointer into ctx 2", 6077 .insns = { 6078 BPF_MOV64_IMM(BPF_REG_0, 0), 6079 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 6080 offsetof(struct __sk_buff, cb[0])), 6081 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_10, 6082 offsetof(struct __sk_buff, cb[0])), 6083 BPF_EXIT_INSN(), 6084 }, 6085 .errstr_unpriv = "R10 leaks addr into mem", 6086 .result_unpriv = REJECT, 6087 .result = REJECT, 6088 .errstr = "BPF_XADD stores into R1 ctx is not allowed", 6089 }, 6090 { 6091 "leak pointer into ctx 3", 6092 .insns = { 6093 BPF_MOV64_IMM(BPF_REG_0, 0), 6094 BPF_LD_MAP_FD(BPF_REG_2, 0), 6095 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 6096 offsetof(struct __sk_buff, cb[0])), 6097 BPF_EXIT_INSN(), 6098 }, 6099 .fixup_map_hash_8b = { 1 }, 6100 .errstr_unpriv = "R2 leaks addr into ctx", 6101 .result_unpriv = REJECT, 6102 .result = ACCEPT, 6103 }, 6104 { 6105 "leak pointer into map val", 6106 .insns = { 6107 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6108 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6109 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6110 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6111 BPF_LD_MAP_FD(BPF_REG_1, 0), 6112 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6113 BPF_FUNC_map_lookup_elem), 6114 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6115 BPF_MOV64_IMM(BPF_REG_3, 0), 6116 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 6117 BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 6118 BPF_MOV64_IMM(BPF_REG_0, 0), 6119 BPF_EXIT_INSN(), 6120 }, 6121 .fixup_map_hash_8b = { 4 }, 6122 .errstr_unpriv = "R6 leaks addr into mem", 6123 .result_unpriv = REJECT, 6124 .result = ACCEPT, 6125 }, 6126 { 6127 "helper access to map: full range", 6128 .insns = { 6129 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6130 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6131 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6132 BPF_LD_MAP_FD(BPF_REG_1, 0), 6133 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6134 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6135 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6136 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6137 BPF_MOV64_IMM(BPF_REG_3, 0), 6138 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6139 BPF_EXIT_INSN(), 6140 }, 6141 .fixup_map_hash_48b = { 3 }, 6142 .result = ACCEPT, 6143 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6144 }, 6145 { 6146 "helper access to map: partial range", 6147 .insns = { 6148 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6149 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6150 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6151 BPF_LD_MAP_FD(BPF_REG_1, 0), 6152 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6153 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6154 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6155 BPF_MOV64_IMM(BPF_REG_2, 8), 6156 BPF_MOV64_IMM(BPF_REG_3, 0), 6157 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6158 BPF_EXIT_INSN(), 6159 }, 6160 .fixup_map_hash_48b = { 3 }, 6161 .result = ACCEPT, 6162 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6163 }, 6164 { 6165 "helper access to map: empty range", 6166 .insns = { 6167 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6168 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6169 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6170 BPF_LD_MAP_FD(BPF_REG_1, 0), 6171 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6172 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6173 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6174 BPF_MOV64_IMM(BPF_REG_2, 0), 6175 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6176 BPF_EXIT_INSN(), 6177 }, 6178 .fixup_map_hash_48b = { 3 }, 6179 .errstr = "invalid access to map value, value_size=48 off=0 size=0", 6180 .result = REJECT, 6181 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6182 }, 6183 { 6184 "helper access to map: out-of-bound range", 6185 .insns = { 6186 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6188 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6189 BPF_LD_MAP_FD(BPF_REG_1, 0), 6190 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6191 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6192 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6193 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8), 6194 BPF_MOV64_IMM(BPF_REG_3, 0), 6195 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6196 BPF_EXIT_INSN(), 6197 }, 6198 .fixup_map_hash_48b = { 3 }, 6199 .errstr = "invalid access to map value, value_size=48 off=0 size=56", 6200 .result = REJECT, 6201 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6202 }, 6203 { 6204 "helper access to map: negative range", 6205 .insns = { 6206 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6207 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6208 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6209 BPF_LD_MAP_FD(BPF_REG_1, 0), 6210 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6211 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6212 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6213 BPF_MOV64_IMM(BPF_REG_2, -8), 6214 BPF_MOV64_IMM(BPF_REG_3, 0), 6215 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6216 BPF_EXIT_INSN(), 6217 }, 6218 .fixup_map_hash_48b = { 3 }, 6219 .errstr = "R2 min value is negative", 6220 .result = REJECT, 6221 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6222 }, 6223 { 6224 "helper access to adjusted map (via const imm): full range", 6225 .insns = { 6226 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6227 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6228 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6229 BPF_LD_MAP_FD(BPF_REG_1, 0), 6230 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6231 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6232 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6233 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6234 offsetof(struct test_val, foo)), 6235 BPF_MOV64_IMM(BPF_REG_2, 6236 sizeof(struct test_val) - 6237 offsetof(struct test_val, foo)), 6238 BPF_MOV64_IMM(BPF_REG_3, 0), 6239 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6240 BPF_EXIT_INSN(), 6241 }, 6242 .fixup_map_hash_48b = { 3 }, 6243 .result = ACCEPT, 6244 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6245 }, 6246 { 6247 "helper access to adjusted map (via const imm): partial range", 6248 .insns = { 6249 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6250 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6251 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6252 BPF_LD_MAP_FD(BPF_REG_1, 0), 6253 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6254 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6255 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6257 offsetof(struct test_val, foo)), 6258 BPF_MOV64_IMM(BPF_REG_2, 8), 6259 BPF_MOV64_IMM(BPF_REG_3, 0), 6260 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6261 BPF_EXIT_INSN(), 6262 }, 6263 .fixup_map_hash_48b = { 3 }, 6264 .result = ACCEPT, 6265 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6266 }, 6267 { 6268 "helper access to adjusted map (via const imm): empty range", 6269 .insns = { 6270 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6271 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6272 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6273 BPF_LD_MAP_FD(BPF_REG_1, 0), 6274 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6275 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6276 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6277 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6278 offsetof(struct test_val, foo)), 6279 BPF_MOV64_IMM(BPF_REG_2, 0), 6280 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6281 BPF_EXIT_INSN(), 6282 }, 6283 .fixup_map_hash_48b = { 3 }, 6284 .errstr = "invalid access to map value, value_size=48 off=4 size=0", 6285 .result = REJECT, 6286 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6287 }, 6288 { 6289 "helper access to adjusted map (via const imm): out-of-bound range", 6290 .insns = { 6291 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6292 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6293 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6294 BPF_LD_MAP_FD(BPF_REG_1, 0), 6295 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6296 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6297 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6298 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6299 offsetof(struct test_val, foo)), 6300 BPF_MOV64_IMM(BPF_REG_2, 6301 sizeof(struct test_val) - 6302 offsetof(struct test_val, foo) + 8), 6303 BPF_MOV64_IMM(BPF_REG_3, 0), 6304 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6305 BPF_EXIT_INSN(), 6306 }, 6307 .fixup_map_hash_48b = { 3 }, 6308 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6309 .result = REJECT, 6310 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6311 }, 6312 { 6313 "helper access to adjusted map (via const imm): negative range (> adjustment)", 6314 .insns = { 6315 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6317 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6318 BPF_LD_MAP_FD(BPF_REG_1, 0), 6319 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6320 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6321 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6322 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6323 offsetof(struct test_val, foo)), 6324 BPF_MOV64_IMM(BPF_REG_2, -8), 6325 BPF_MOV64_IMM(BPF_REG_3, 0), 6326 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6327 BPF_EXIT_INSN(), 6328 }, 6329 .fixup_map_hash_48b = { 3 }, 6330 .errstr = "R2 min value is negative", 6331 .result = REJECT, 6332 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6333 }, 6334 { 6335 "helper access to adjusted map (via const imm): negative range (< adjustment)", 6336 .insns = { 6337 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6339 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6340 BPF_LD_MAP_FD(BPF_REG_1, 0), 6341 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6342 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6343 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6344 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6345 offsetof(struct test_val, foo)), 6346 BPF_MOV64_IMM(BPF_REG_2, -1), 6347 BPF_MOV64_IMM(BPF_REG_3, 0), 6348 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6349 BPF_EXIT_INSN(), 6350 }, 6351 .fixup_map_hash_48b = { 3 }, 6352 .errstr = "R2 min value is negative", 6353 .result = REJECT, 6354 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6355 }, 6356 { 6357 "helper access to adjusted map (via const reg): full range", 6358 .insns = { 6359 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6360 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6361 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6362 BPF_LD_MAP_FD(BPF_REG_1, 0), 6363 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6364 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6365 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6366 BPF_MOV64_IMM(BPF_REG_3, 6367 offsetof(struct test_val, foo)), 6368 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6369 BPF_MOV64_IMM(BPF_REG_2, 6370 sizeof(struct test_val) - 6371 offsetof(struct test_val, foo)), 6372 BPF_MOV64_IMM(BPF_REG_3, 0), 6373 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6374 BPF_EXIT_INSN(), 6375 }, 6376 .fixup_map_hash_48b = { 3 }, 6377 .result = ACCEPT, 6378 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6379 }, 6380 { 6381 "helper access to adjusted map (via const reg): partial range", 6382 .insns = { 6383 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6384 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6385 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6386 BPF_LD_MAP_FD(BPF_REG_1, 0), 6387 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6388 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6389 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6390 BPF_MOV64_IMM(BPF_REG_3, 6391 offsetof(struct test_val, foo)), 6392 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6393 BPF_MOV64_IMM(BPF_REG_2, 8), 6394 BPF_MOV64_IMM(BPF_REG_3, 0), 6395 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6396 BPF_EXIT_INSN(), 6397 }, 6398 .fixup_map_hash_48b = { 3 }, 6399 .result = ACCEPT, 6400 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6401 }, 6402 { 6403 "helper access to adjusted map (via const reg): empty range", 6404 .insns = { 6405 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6406 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6407 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6408 BPF_LD_MAP_FD(BPF_REG_1, 0), 6409 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6410 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6411 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6412 BPF_MOV64_IMM(BPF_REG_3, 0), 6413 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6414 BPF_MOV64_IMM(BPF_REG_2, 0), 6415 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6416 BPF_EXIT_INSN(), 6417 }, 6418 .fixup_map_hash_48b = { 3 }, 6419 .errstr = "R1 min value is outside of the array range", 6420 .result = REJECT, 6421 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6422 }, 6423 { 6424 "helper access to adjusted map (via const reg): out-of-bound range", 6425 .insns = { 6426 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6427 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6428 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6429 BPF_LD_MAP_FD(BPF_REG_1, 0), 6430 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6431 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6432 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6433 BPF_MOV64_IMM(BPF_REG_3, 6434 offsetof(struct test_val, foo)), 6435 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6436 BPF_MOV64_IMM(BPF_REG_2, 6437 sizeof(struct test_val) - 6438 offsetof(struct test_val, foo) + 8), 6439 BPF_MOV64_IMM(BPF_REG_3, 0), 6440 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6441 BPF_EXIT_INSN(), 6442 }, 6443 .fixup_map_hash_48b = { 3 }, 6444 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 6445 .result = REJECT, 6446 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6447 }, 6448 { 6449 "helper access to adjusted map (via const reg): negative range (> adjustment)", 6450 .insns = { 6451 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6452 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6453 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6454 BPF_LD_MAP_FD(BPF_REG_1, 0), 6455 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6456 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6457 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6458 BPF_MOV64_IMM(BPF_REG_3, 6459 offsetof(struct test_val, foo)), 6460 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6461 BPF_MOV64_IMM(BPF_REG_2, -8), 6462 BPF_MOV64_IMM(BPF_REG_3, 0), 6463 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6464 BPF_EXIT_INSN(), 6465 }, 6466 .fixup_map_hash_48b = { 3 }, 6467 .errstr = "R2 min value is negative", 6468 .result = REJECT, 6469 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6470 }, 6471 { 6472 "helper access to adjusted map (via const reg): negative range (< adjustment)", 6473 .insns = { 6474 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6475 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6476 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6477 BPF_LD_MAP_FD(BPF_REG_1, 0), 6478 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6479 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6480 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6481 BPF_MOV64_IMM(BPF_REG_3, 6482 offsetof(struct test_val, foo)), 6483 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6484 BPF_MOV64_IMM(BPF_REG_2, -1), 6485 BPF_MOV64_IMM(BPF_REG_3, 0), 6486 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6487 BPF_EXIT_INSN(), 6488 }, 6489 .fixup_map_hash_48b = { 3 }, 6490 .errstr = "R2 min value is negative", 6491 .result = REJECT, 6492 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6493 }, 6494 { 6495 "helper access to adjusted map (via variable): full range", 6496 .insns = { 6497 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6498 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6499 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6500 BPF_LD_MAP_FD(BPF_REG_1, 0), 6501 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6502 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6503 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6504 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6505 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6506 offsetof(struct test_val, foo), 4), 6507 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6508 BPF_MOV64_IMM(BPF_REG_2, 6509 sizeof(struct test_val) - 6510 offsetof(struct test_val, foo)), 6511 BPF_MOV64_IMM(BPF_REG_3, 0), 6512 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6513 BPF_EXIT_INSN(), 6514 }, 6515 .fixup_map_hash_48b = { 3 }, 6516 .result = ACCEPT, 6517 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6518 }, 6519 { 6520 "helper access to adjusted map (via variable): partial range", 6521 .insns = { 6522 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6523 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6524 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6525 BPF_LD_MAP_FD(BPF_REG_1, 0), 6526 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6527 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6528 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6529 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6530 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6531 offsetof(struct test_val, foo), 4), 6532 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6533 BPF_MOV64_IMM(BPF_REG_2, 8), 6534 BPF_MOV64_IMM(BPF_REG_3, 0), 6535 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6536 BPF_EXIT_INSN(), 6537 }, 6538 .fixup_map_hash_48b = { 3 }, 6539 .result = ACCEPT, 6540 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6541 }, 6542 { 6543 "helper access to adjusted map (via variable): empty range", 6544 .insns = { 6545 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6546 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6547 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6548 BPF_LD_MAP_FD(BPF_REG_1, 0), 6549 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6550 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6551 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6552 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6553 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6554 offsetof(struct test_val, foo), 3), 6555 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6556 BPF_MOV64_IMM(BPF_REG_2, 0), 6557 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 6558 BPF_EXIT_INSN(), 6559 }, 6560 .fixup_map_hash_48b = { 3 }, 6561 .errstr = "R1 min value is outside of the array range", 6562 .result = REJECT, 6563 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6564 }, 6565 { 6566 "helper access to adjusted map (via variable): no max check", 6567 .insns = { 6568 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6569 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6570 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6571 BPF_LD_MAP_FD(BPF_REG_1, 0), 6572 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6573 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6574 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6575 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6576 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6577 BPF_MOV64_IMM(BPF_REG_2, 1), 6578 BPF_MOV64_IMM(BPF_REG_3, 0), 6579 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6580 BPF_EXIT_INSN(), 6581 }, 6582 .fixup_map_hash_48b = { 3 }, 6583 .errstr = "R1 unbounded memory access", 6584 .result = REJECT, 6585 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6586 }, 6587 { 6588 "helper access to adjusted map (via variable): wrong max check", 6589 .insns = { 6590 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6591 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6592 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6593 BPF_LD_MAP_FD(BPF_REG_1, 0), 6594 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6595 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6596 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6597 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6598 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 6599 offsetof(struct test_val, foo), 4), 6600 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6601 BPF_MOV64_IMM(BPF_REG_2, 6602 sizeof(struct test_val) - 6603 offsetof(struct test_val, foo) + 1), 6604 BPF_MOV64_IMM(BPF_REG_3, 0), 6605 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6606 BPF_EXIT_INSN(), 6607 }, 6608 .fixup_map_hash_48b = { 3 }, 6609 .errstr = "invalid access to map value, value_size=48 off=4 size=45", 6610 .result = REJECT, 6611 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6612 }, 6613 { 6614 "helper access to map: bounds check using <, good access", 6615 .insns = { 6616 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6617 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6618 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6619 BPF_LD_MAP_FD(BPF_REG_1, 0), 6620 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6621 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6622 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6623 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6624 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2), 6625 BPF_MOV64_IMM(BPF_REG_0, 0), 6626 BPF_EXIT_INSN(), 6627 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6628 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6629 BPF_MOV64_IMM(BPF_REG_0, 0), 6630 BPF_EXIT_INSN(), 6631 }, 6632 .fixup_map_hash_48b = { 3 }, 6633 .result = ACCEPT, 6634 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6635 }, 6636 { 6637 "helper access to map: bounds check using <, bad access", 6638 .insns = { 6639 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6640 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6641 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6642 BPF_LD_MAP_FD(BPF_REG_1, 0), 6643 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6644 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6645 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6646 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6647 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4), 6648 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6649 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6650 BPF_MOV64_IMM(BPF_REG_0, 0), 6651 BPF_EXIT_INSN(), 6652 BPF_MOV64_IMM(BPF_REG_0, 0), 6653 BPF_EXIT_INSN(), 6654 }, 6655 .fixup_map_hash_48b = { 3 }, 6656 .result = REJECT, 6657 .errstr = "R1 unbounded memory access", 6658 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6659 }, 6660 { 6661 "helper access to map: bounds check using <=, good access", 6662 .insns = { 6663 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6665 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6666 BPF_LD_MAP_FD(BPF_REG_1, 0), 6667 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6668 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6669 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6670 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6671 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2), 6672 BPF_MOV64_IMM(BPF_REG_0, 0), 6673 BPF_EXIT_INSN(), 6674 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6675 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6676 BPF_MOV64_IMM(BPF_REG_0, 0), 6677 BPF_EXIT_INSN(), 6678 }, 6679 .fixup_map_hash_48b = { 3 }, 6680 .result = ACCEPT, 6681 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6682 }, 6683 { 6684 "helper access to map: bounds check using <=, bad access", 6685 .insns = { 6686 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6687 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6688 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6689 BPF_LD_MAP_FD(BPF_REG_1, 0), 6690 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6691 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6692 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6693 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6694 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4), 6695 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6696 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6697 BPF_MOV64_IMM(BPF_REG_0, 0), 6698 BPF_EXIT_INSN(), 6699 BPF_MOV64_IMM(BPF_REG_0, 0), 6700 BPF_EXIT_INSN(), 6701 }, 6702 .fixup_map_hash_48b = { 3 }, 6703 .result = REJECT, 6704 .errstr = "R1 unbounded memory access", 6705 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6706 }, 6707 { 6708 "helper access to map: bounds check using s<, good access", 6709 .insns = { 6710 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6711 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6712 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6713 BPF_LD_MAP_FD(BPF_REG_1, 0), 6714 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6715 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6716 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6717 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6718 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6719 BPF_MOV64_IMM(BPF_REG_0, 0), 6720 BPF_EXIT_INSN(), 6721 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3), 6722 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6723 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6724 BPF_MOV64_IMM(BPF_REG_0, 0), 6725 BPF_EXIT_INSN(), 6726 }, 6727 .fixup_map_hash_48b = { 3 }, 6728 .result = ACCEPT, 6729 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6730 }, 6731 { 6732 "helper access to map: bounds check using s<, good access 2", 6733 .insns = { 6734 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6735 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6736 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6737 BPF_LD_MAP_FD(BPF_REG_1, 0), 6738 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6739 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6740 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6741 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6742 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6743 BPF_MOV64_IMM(BPF_REG_0, 0), 6744 BPF_EXIT_INSN(), 6745 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6746 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6747 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6748 BPF_MOV64_IMM(BPF_REG_0, 0), 6749 BPF_EXIT_INSN(), 6750 }, 6751 .fixup_map_hash_48b = { 3 }, 6752 .result = ACCEPT, 6753 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6754 }, 6755 { 6756 "helper access to map: bounds check using s<, bad access", 6757 .insns = { 6758 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6759 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6760 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6761 BPF_LD_MAP_FD(BPF_REG_1, 0), 6762 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6763 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6764 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6765 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6766 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 6767 BPF_MOV64_IMM(BPF_REG_0, 0), 6768 BPF_EXIT_INSN(), 6769 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 6770 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6771 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6772 BPF_MOV64_IMM(BPF_REG_0, 0), 6773 BPF_EXIT_INSN(), 6774 }, 6775 .fixup_map_hash_48b = { 3 }, 6776 .result = REJECT, 6777 .errstr = "R1 min value is negative", 6778 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6779 }, 6780 { 6781 "helper access to map: bounds check using s<=, good access", 6782 .insns = { 6783 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6784 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6785 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6786 BPF_LD_MAP_FD(BPF_REG_1, 0), 6787 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6788 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6789 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6790 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6791 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6792 BPF_MOV64_IMM(BPF_REG_0, 0), 6793 BPF_EXIT_INSN(), 6794 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3), 6795 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6796 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6797 BPF_MOV64_IMM(BPF_REG_0, 0), 6798 BPF_EXIT_INSN(), 6799 }, 6800 .fixup_map_hash_48b = { 3 }, 6801 .result = ACCEPT, 6802 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6803 }, 6804 { 6805 "helper access to map: bounds check using s<=, good access 2", 6806 .insns = { 6807 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6808 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6809 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6810 BPF_LD_MAP_FD(BPF_REG_1, 0), 6811 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6812 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6813 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6814 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 6815 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6816 BPF_MOV64_IMM(BPF_REG_0, 0), 6817 BPF_EXIT_INSN(), 6818 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6819 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6820 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6821 BPF_MOV64_IMM(BPF_REG_0, 0), 6822 BPF_EXIT_INSN(), 6823 }, 6824 .fixup_map_hash_48b = { 3 }, 6825 .result = ACCEPT, 6826 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6827 }, 6828 { 6829 "helper access to map: bounds check using s<=, bad access", 6830 .insns = { 6831 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6832 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6833 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6834 BPF_LD_MAP_FD(BPF_REG_1, 0), 6835 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6836 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6837 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6838 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 6839 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 6840 BPF_MOV64_IMM(BPF_REG_0, 0), 6841 BPF_EXIT_INSN(), 6842 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 6843 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 6844 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 6845 BPF_MOV64_IMM(BPF_REG_0, 0), 6846 BPF_EXIT_INSN(), 6847 }, 6848 .fixup_map_hash_48b = { 3 }, 6849 .result = REJECT, 6850 .errstr = "R1 min value is negative", 6851 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6852 }, 6853 { 6854 "map access: known scalar += value_ptr from different maps", 6855 .insns = { 6856 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6857 offsetof(struct __sk_buff, len)), 6858 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6859 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6860 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6861 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6862 BPF_LD_MAP_FD(BPF_REG_1, 0), 6863 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6864 BPF_LD_MAP_FD(BPF_REG_1, 0), 6865 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6866 BPF_FUNC_map_lookup_elem), 6867 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6868 BPF_MOV64_IMM(BPF_REG_1, 4), 6869 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6870 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6871 BPF_MOV64_IMM(BPF_REG_0, 1), 6872 BPF_EXIT_INSN(), 6873 }, 6874 .fixup_map_hash_16b = { 5 }, 6875 .fixup_map_array_48b = { 8 }, 6876 .result = ACCEPT, 6877 .result_unpriv = REJECT, 6878 .errstr_unpriv = "R1 tried to add from different maps", 6879 .retval = 1, 6880 }, 6881 { 6882 "map access: value_ptr -= known scalar from different maps", 6883 .insns = { 6884 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6885 offsetof(struct __sk_buff, len)), 6886 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6887 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6889 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6890 BPF_LD_MAP_FD(BPF_REG_1, 0), 6891 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6892 BPF_LD_MAP_FD(BPF_REG_1, 0), 6893 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6894 BPF_FUNC_map_lookup_elem), 6895 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6896 BPF_MOV64_IMM(BPF_REG_1, 4), 6897 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6898 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6899 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6900 BPF_MOV64_IMM(BPF_REG_0, 1), 6901 BPF_EXIT_INSN(), 6902 }, 6903 .fixup_map_hash_16b = { 5 }, 6904 .fixup_map_array_48b = { 8 }, 6905 .result = ACCEPT, 6906 .result_unpriv = REJECT, 6907 .errstr_unpriv = "R0 min value is outside of the array range", 6908 .retval = 1, 6909 }, 6910 { 6911 "map access: known scalar += value_ptr from different maps, but same value properties", 6912 .insns = { 6913 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6914 offsetof(struct __sk_buff, len)), 6915 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6916 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6918 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), 6919 BPF_LD_MAP_FD(BPF_REG_1, 0), 6920 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 6921 BPF_LD_MAP_FD(BPF_REG_1, 0), 6922 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6923 BPF_FUNC_map_lookup_elem), 6924 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 6925 BPF_MOV64_IMM(BPF_REG_1, 4), 6926 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 6927 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 6928 BPF_MOV64_IMM(BPF_REG_0, 1), 6929 BPF_EXIT_INSN(), 6930 }, 6931 .fixup_map_hash_48b = { 5 }, 6932 .fixup_map_array_48b = { 8 }, 6933 .result = ACCEPT, 6934 .retval = 1, 6935 }, 6936 { 6937 "map access: value_ptr += known scalar, upper oob arith, test 1", 6938 .insns = { 6939 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6940 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6941 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6942 BPF_LD_MAP_FD(BPF_REG_1, 0), 6943 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6944 BPF_FUNC_map_lookup_elem), 6945 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6946 BPF_MOV64_IMM(BPF_REG_1, 48), 6947 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6948 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6949 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6950 BPF_MOV64_IMM(BPF_REG_0, 1), 6951 BPF_EXIT_INSN(), 6952 }, 6953 .fixup_map_array_48b = { 3 }, 6954 .result = ACCEPT, 6955 .result_unpriv = REJECT, 6956 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 6957 .retval = 1, 6958 }, 6959 { 6960 "map access: value_ptr += known scalar, upper oob arith, test 2", 6961 .insns = { 6962 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6963 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6964 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6965 BPF_LD_MAP_FD(BPF_REG_1, 0), 6966 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6967 BPF_FUNC_map_lookup_elem), 6968 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6969 BPF_MOV64_IMM(BPF_REG_1, 49), 6970 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6971 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6972 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6973 BPF_MOV64_IMM(BPF_REG_0, 1), 6974 BPF_EXIT_INSN(), 6975 }, 6976 .fixup_map_array_48b = { 3 }, 6977 .result = ACCEPT, 6978 .result_unpriv = REJECT, 6979 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 6980 .retval = 1, 6981 }, 6982 { 6983 "map access: value_ptr += known scalar, upper oob arith, test 3", 6984 .insns = { 6985 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6986 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6987 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6988 BPF_LD_MAP_FD(BPF_REG_1, 0), 6989 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6990 BPF_FUNC_map_lookup_elem), 6991 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6992 BPF_MOV64_IMM(BPF_REG_1, 47), 6993 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6994 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 6995 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 6996 BPF_MOV64_IMM(BPF_REG_0, 1), 6997 BPF_EXIT_INSN(), 6998 }, 6999 .fixup_map_array_48b = { 3 }, 7000 .result = ACCEPT, 7001 .result_unpriv = REJECT, 7002 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7003 .retval = 1, 7004 }, 7005 { 7006 "map access: value_ptr -= known scalar, lower oob arith, test 1", 7007 .insns = { 7008 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7009 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7010 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7011 BPF_LD_MAP_FD(BPF_REG_1, 0), 7012 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7013 BPF_FUNC_map_lookup_elem), 7014 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7015 BPF_MOV64_IMM(BPF_REG_1, 47), 7016 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7017 BPF_MOV64_IMM(BPF_REG_1, 48), 7018 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7019 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7020 BPF_MOV64_IMM(BPF_REG_0, 1), 7021 BPF_EXIT_INSN(), 7022 }, 7023 .fixup_map_array_48b = { 3 }, 7024 .result = REJECT, 7025 .errstr = "R0 min value is outside of the array range", 7026 .result_unpriv = REJECT, 7027 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7028 }, 7029 { 7030 "map access: value_ptr -= known scalar, lower oob arith, test 2", 7031 .insns = { 7032 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7033 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7034 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7035 BPF_LD_MAP_FD(BPF_REG_1, 0), 7036 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7037 BPF_FUNC_map_lookup_elem), 7038 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7039 BPF_MOV64_IMM(BPF_REG_1, 47), 7040 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7041 BPF_MOV64_IMM(BPF_REG_1, 48), 7042 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7043 BPF_MOV64_IMM(BPF_REG_1, 1), 7044 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7045 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7046 BPF_MOV64_IMM(BPF_REG_0, 1), 7047 BPF_EXIT_INSN(), 7048 }, 7049 .fixup_map_array_48b = { 3 }, 7050 .result = ACCEPT, 7051 .result_unpriv = REJECT, 7052 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7053 .retval = 1, 7054 }, 7055 { 7056 "map access: value_ptr -= known scalar, lower oob arith, test 3", 7057 .insns = { 7058 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7059 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7060 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7061 BPF_LD_MAP_FD(BPF_REG_1, 0), 7062 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7063 BPF_FUNC_map_lookup_elem), 7064 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7065 BPF_MOV64_IMM(BPF_REG_1, 47), 7066 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7067 BPF_MOV64_IMM(BPF_REG_1, 47), 7068 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7069 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7070 BPF_MOV64_IMM(BPF_REG_0, 1), 7071 BPF_EXIT_INSN(), 7072 }, 7073 .fixup_map_array_48b = { 3 }, 7074 .result = ACCEPT, 7075 .result_unpriv = REJECT, 7076 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7077 .retval = 1, 7078 }, 7079 { 7080 "map access: known scalar += value_ptr", 7081 .insns = { 7082 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7083 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7084 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7085 BPF_LD_MAP_FD(BPF_REG_1, 0), 7086 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7087 BPF_FUNC_map_lookup_elem), 7088 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7089 BPF_MOV64_IMM(BPF_REG_1, 4), 7090 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7091 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7092 BPF_MOV64_IMM(BPF_REG_0, 1), 7093 BPF_EXIT_INSN(), 7094 }, 7095 .fixup_map_array_48b = { 3 }, 7096 .result = ACCEPT, 7097 .retval = 1, 7098 }, 7099 { 7100 "map access: value_ptr += known scalar, 1", 7101 .insns = { 7102 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7103 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7104 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7105 BPF_LD_MAP_FD(BPF_REG_1, 0), 7106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7107 BPF_FUNC_map_lookup_elem), 7108 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7109 BPF_MOV64_IMM(BPF_REG_1, 4), 7110 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7111 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7112 BPF_MOV64_IMM(BPF_REG_0, 1), 7113 BPF_EXIT_INSN(), 7114 }, 7115 .fixup_map_array_48b = { 3 }, 7116 .result = ACCEPT, 7117 .retval = 1, 7118 }, 7119 { 7120 "map access: value_ptr += known scalar, 2", 7121 .insns = { 7122 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7123 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7124 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7125 BPF_LD_MAP_FD(BPF_REG_1, 0), 7126 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7127 BPF_FUNC_map_lookup_elem), 7128 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7129 BPF_MOV64_IMM(BPF_REG_1, 49), 7130 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7131 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7132 BPF_MOV64_IMM(BPF_REG_0, 1), 7133 BPF_EXIT_INSN(), 7134 }, 7135 .fixup_map_array_48b = { 3 }, 7136 .result = REJECT, 7137 .errstr = "invalid access to map value", 7138 }, 7139 { 7140 "map access: value_ptr += known scalar, 3", 7141 .insns = { 7142 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7143 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7144 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7145 BPF_LD_MAP_FD(BPF_REG_1, 0), 7146 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7147 BPF_FUNC_map_lookup_elem), 7148 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7149 BPF_MOV64_IMM(BPF_REG_1, -1), 7150 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7151 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7152 BPF_MOV64_IMM(BPF_REG_0, 1), 7153 BPF_EXIT_INSN(), 7154 }, 7155 .fixup_map_array_48b = { 3 }, 7156 .result = REJECT, 7157 .errstr = "invalid access to map value", 7158 }, 7159 { 7160 "map access: value_ptr += known scalar, 4", 7161 .insns = { 7162 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7163 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7164 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7165 BPF_LD_MAP_FD(BPF_REG_1, 0), 7166 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7167 BPF_FUNC_map_lookup_elem), 7168 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7169 BPF_MOV64_IMM(BPF_REG_1, 5), 7170 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7171 BPF_MOV64_IMM(BPF_REG_1, -2), 7172 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7173 BPF_MOV64_IMM(BPF_REG_1, -1), 7174 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7175 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7176 BPF_MOV64_IMM(BPF_REG_0, 1), 7177 BPF_EXIT_INSN(), 7178 }, 7179 .fixup_map_array_48b = { 3 }, 7180 .result = ACCEPT, 7181 .result_unpriv = REJECT, 7182 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7183 .retval = 1, 7184 }, 7185 { 7186 "map access: value_ptr += known scalar, 5", 7187 .insns = { 7188 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7189 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7190 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7191 BPF_LD_MAP_FD(BPF_REG_1, 0), 7192 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7193 BPF_FUNC_map_lookup_elem), 7194 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7195 BPF_MOV64_IMM(BPF_REG_1, (6 + 1) * sizeof(int)), 7196 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7197 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7198 BPF_EXIT_INSN(), 7199 }, 7200 .fixup_map_array_48b = { 3 }, 7201 .result = ACCEPT, 7202 .retval = 0xabcdef12, 7203 }, 7204 { 7205 "map access: value_ptr += known scalar, 6", 7206 .insns = { 7207 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7208 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7209 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7210 BPF_LD_MAP_FD(BPF_REG_1, 0), 7211 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7212 BPF_FUNC_map_lookup_elem), 7213 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7214 BPF_MOV64_IMM(BPF_REG_1, (3 + 1) * sizeof(int)), 7215 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7216 BPF_MOV64_IMM(BPF_REG_1, 3 * sizeof(int)), 7217 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7218 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), 7219 BPF_EXIT_INSN(), 7220 }, 7221 .fixup_map_array_48b = { 3 }, 7222 .result = ACCEPT, 7223 .retval = 0xabcdef12, 7224 }, 7225 { 7226 "map access: unknown scalar += value_ptr, 1", 7227 .insns = { 7228 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7229 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7230 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7231 BPF_LD_MAP_FD(BPF_REG_1, 0), 7232 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7233 BPF_FUNC_map_lookup_elem), 7234 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7235 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7236 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7237 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7238 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7239 BPF_MOV64_IMM(BPF_REG_0, 1), 7240 BPF_EXIT_INSN(), 7241 }, 7242 .fixup_map_array_48b = { 3 }, 7243 .result = ACCEPT, 7244 .retval = 1, 7245 }, 7246 { 7247 "map access: unknown scalar += value_ptr, 2", 7248 .insns = { 7249 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7250 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7251 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7252 BPF_LD_MAP_FD(BPF_REG_1, 0), 7253 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7254 BPF_FUNC_map_lookup_elem), 7255 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7256 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7257 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7258 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7259 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7260 BPF_EXIT_INSN(), 7261 }, 7262 .fixup_map_array_48b = { 3 }, 7263 .result = ACCEPT, 7264 .retval = 0xabcdef12, 7265 }, 7266 { 7267 "map access: unknown scalar += value_ptr, 3", 7268 .insns = { 7269 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7270 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7271 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7272 BPF_LD_MAP_FD(BPF_REG_1, 0), 7273 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7274 BPF_FUNC_map_lookup_elem), 7275 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7276 BPF_MOV64_IMM(BPF_REG_1, -1), 7277 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7278 BPF_MOV64_IMM(BPF_REG_1, 1), 7279 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7280 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7281 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7282 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7283 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7284 BPF_EXIT_INSN(), 7285 }, 7286 .fixup_map_array_48b = { 3 }, 7287 .result = ACCEPT, 7288 .result_unpriv = REJECT, 7289 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7290 .retval = 0xabcdef12, 7291 }, 7292 { 7293 "map access: unknown scalar += value_ptr, 4", 7294 .insns = { 7295 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7296 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7297 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7298 BPF_LD_MAP_FD(BPF_REG_1, 0), 7299 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7300 BPF_FUNC_map_lookup_elem), 7301 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7302 BPF_MOV64_IMM(BPF_REG_1, 19), 7303 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7304 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7305 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7306 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 7307 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7308 BPF_EXIT_INSN(), 7309 }, 7310 .fixup_map_array_48b = { 3 }, 7311 .result = REJECT, 7312 .errstr = "R1 max value is outside of the array range", 7313 .errstr_unpriv = "R1 pointer arithmetic of map value goes out of range", 7314 }, 7315 { 7316 "map access: value_ptr += unknown scalar, 1", 7317 .insns = { 7318 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7319 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7320 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7321 BPF_LD_MAP_FD(BPF_REG_1, 0), 7322 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7323 BPF_FUNC_map_lookup_elem), 7324 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7325 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7326 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7327 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7328 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7329 BPF_MOV64_IMM(BPF_REG_0, 1), 7330 BPF_EXIT_INSN(), 7331 }, 7332 .fixup_map_array_48b = { 3 }, 7333 .result = ACCEPT, 7334 .retval = 1, 7335 }, 7336 { 7337 "map access: value_ptr += unknown scalar, 2", 7338 .insns = { 7339 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7340 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7341 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7342 BPF_LD_MAP_FD(BPF_REG_1, 0), 7343 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7344 BPF_FUNC_map_lookup_elem), 7345 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7346 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7347 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), 7348 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7349 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), 7350 BPF_EXIT_INSN(), 7351 }, 7352 .fixup_map_array_48b = { 3 }, 7353 .result = ACCEPT, 7354 .retval = 0xabcdef12, 7355 }, 7356 { 7357 "map access: value_ptr += unknown scalar, 3", 7358 .insns = { 7359 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7360 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7361 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7362 BPF_LD_MAP_FD(BPF_REG_1, 0), 7363 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7364 BPF_FUNC_map_lookup_elem), 7365 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7366 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7367 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 8), 7368 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 16), 7369 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7370 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 1), 7371 BPF_ALU64_IMM(BPF_OR, BPF_REG_3, 1), 7372 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_3, 4), 7373 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 7374 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7375 BPF_MOV64_IMM(BPF_REG_0, 1), 7376 BPF_EXIT_INSN(), 7377 BPF_MOV64_IMM(BPF_REG_0, 2), 7378 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 7379 }, 7380 .fixup_map_array_48b = { 3 }, 7381 .result = ACCEPT, 7382 .retval = 1, 7383 }, 7384 { 7385 "map access: value_ptr += value_ptr", 7386 .insns = { 7387 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7388 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7389 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7390 BPF_LD_MAP_FD(BPF_REG_1, 0), 7391 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7392 BPF_FUNC_map_lookup_elem), 7393 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7394 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_0), 7395 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7396 BPF_MOV64_IMM(BPF_REG_0, 1), 7397 BPF_EXIT_INSN(), 7398 }, 7399 .fixup_map_array_48b = { 3 }, 7400 .result = REJECT, 7401 .errstr = "R0 pointer += pointer prohibited", 7402 }, 7403 { 7404 "map access: known scalar -= value_ptr", 7405 .insns = { 7406 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7407 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7408 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7409 BPF_LD_MAP_FD(BPF_REG_1, 0), 7410 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7411 BPF_FUNC_map_lookup_elem), 7412 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7413 BPF_MOV64_IMM(BPF_REG_1, 4), 7414 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 7415 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7416 BPF_MOV64_IMM(BPF_REG_0, 1), 7417 BPF_EXIT_INSN(), 7418 }, 7419 .fixup_map_array_48b = { 3 }, 7420 .result = REJECT, 7421 .errstr = "R1 tried to subtract pointer from scalar", 7422 }, 7423 { 7424 "map access: value_ptr -= known scalar", 7425 .insns = { 7426 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7427 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7428 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7429 BPF_LD_MAP_FD(BPF_REG_1, 0), 7430 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7431 BPF_FUNC_map_lookup_elem), 7432 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 7433 BPF_MOV64_IMM(BPF_REG_1, 4), 7434 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7435 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7436 BPF_MOV64_IMM(BPF_REG_0, 1), 7437 BPF_EXIT_INSN(), 7438 }, 7439 .fixup_map_array_48b = { 3 }, 7440 .result = REJECT, 7441 .errstr = "R0 min value is outside of the array range", 7442 }, 7443 { 7444 "map access: value_ptr -= known scalar, 2", 7445 .insns = { 7446 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7447 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7448 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7449 BPF_LD_MAP_FD(BPF_REG_1, 0), 7450 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7451 BPF_FUNC_map_lookup_elem), 7452 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7453 BPF_MOV64_IMM(BPF_REG_1, 6), 7454 BPF_MOV64_IMM(BPF_REG_2, 4), 7455 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7456 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 7457 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7458 BPF_MOV64_IMM(BPF_REG_0, 1), 7459 BPF_EXIT_INSN(), 7460 }, 7461 .fixup_map_array_48b = { 3 }, 7462 .result = ACCEPT, 7463 .result_unpriv = REJECT, 7464 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7465 .retval = 1, 7466 }, 7467 { 7468 "map access: unknown scalar -= value_ptr", 7469 .insns = { 7470 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7471 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7472 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7473 BPF_LD_MAP_FD(BPF_REG_1, 0), 7474 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7475 BPF_FUNC_map_lookup_elem), 7476 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7477 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7478 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7479 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 7480 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), 7481 BPF_MOV64_IMM(BPF_REG_0, 1), 7482 BPF_EXIT_INSN(), 7483 }, 7484 .fixup_map_array_48b = { 3 }, 7485 .result = REJECT, 7486 .errstr = "R1 tried to subtract pointer from scalar", 7487 }, 7488 { 7489 "map access: value_ptr -= unknown scalar", 7490 .insns = { 7491 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7492 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7493 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7494 BPF_LD_MAP_FD(BPF_REG_1, 0), 7495 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7496 BPF_FUNC_map_lookup_elem), 7497 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7498 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7499 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7500 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7501 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7502 BPF_MOV64_IMM(BPF_REG_0, 1), 7503 BPF_EXIT_INSN(), 7504 }, 7505 .fixup_map_array_48b = { 3 }, 7506 .result = REJECT, 7507 .errstr = "R0 min value is negative", 7508 }, 7509 { 7510 "map access: value_ptr -= unknown scalar, 2", 7511 .insns = { 7512 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7513 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7514 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7515 BPF_LD_MAP_FD(BPF_REG_1, 0), 7516 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7517 BPF_FUNC_map_lookup_elem), 7518 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7519 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7520 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), 7521 BPF_ALU64_IMM(BPF_OR, BPF_REG_1, 0x7), 7522 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7523 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7524 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0x7), 7525 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7526 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7527 BPF_MOV64_IMM(BPF_REG_0, 1), 7528 BPF_EXIT_INSN(), 7529 }, 7530 .fixup_map_array_48b = { 3 }, 7531 .result = ACCEPT, 7532 .result_unpriv = REJECT, 7533 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 7534 .retval = 1, 7535 }, 7536 { 7537 "map access: value_ptr -= value_ptr", 7538 .insns = { 7539 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7540 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7541 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7542 BPF_LD_MAP_FD(BPF_REG_1, 0), 7543 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7544 BPF_FUNC_map_lookup_elem), 7545 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7546 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_0), 7547 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7548 BPF_MOV64_IMM(BPF_REG_0, 1), 7549 BPF_EXIT_INSN(), 7550 }, 7551 .fixup_map_array_48b = { 3 }, 7552 .result = REJECT, 7553 .errstr = "R0 invalid mem access 'inv'", 7554 .errstr_unpriv = "R0 pointer -= pointer prohibited", 7555 }, 7556 { 7557 "map lookup helper access to map", 7558 .insns = { 7559 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7560 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7561 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7562 BPF_LD_MAP_FD(BPF_REG_1, 0), 7563 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7564 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7565 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7566 BPF_LD_MAP_FD(BPF_REG_1, 0), 7567 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7568 BPF_EXIT_INSN(), 7569 }, 7570 .fixup_map_hash_16b = { 3, 8 }, 7571 .result = ACCEPT, 7572 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7573 }, 7574 { 7575 "map update helper access to map", 7576 .insns = { 7577 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7578 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7579 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7580 BPF_LD_MAP_FD(BPF_REG_1, 0), 7581 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7582 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7583 BPF_MOV64_IMM(BPF_REG_4, 0), 7584 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 7585 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7586 BPF_LD_MAP_FD(BPF_REG_1, 0), 7587 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 7588 BPF_EXIT_INSN(), 7589 }, 7590 .fixup_map_hash_16b = { 3, 10 }, 7591 .result = ACCEPT, 7592 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7593 }, 7594 { 7595 "map update helper access to map: wrong size", 7596 .insns = { 7597 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7598 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7599 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7600 BPF_LD_MAP_FD(BPF_REG_1, 0), 7601 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7602 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7603 BPF_MOV64_IMM(BPF_REG_4, 0), 7604 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 7605 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7606 BPF_LD_MAP_FD(BPF_REG_1, 0), 7607 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 7608 BPF_EXIT_INSN(), 7609 }, 7610 .fixup_map_hash_8b = { 3 }, 7611 .fixup_map_hash_16b = { 10 }, 7612 .result = REJECT, 7613 .errstr = "invalid access to map value, value_size=8 off=0 size=16", 7614 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7615 }, 7616 { 7617 "map helper access to adjusted map (via const imm)", 7618 .insns = { 7619 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7620 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7621 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7622 BPF_LD_MAP_FD(BPF_REG_1, 0), 7623 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7624 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7625 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7626 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 7627 offsetof(struct other_val, bar)), 7628 BPF_LD_MAP_FD(BPF_REG_1, 0), 7629 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7630 BPF_EXIT_INSN(), 7631 }, 7632 .fixup_map_hash_16b = { 3, 9 }, 7633 .result = ACCEPT, 7634 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7635 }, 7636 { 7637 "map helper access to adjusted map (via const imm): out-of-bound 1", 7638 .insns = { 7639 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7640 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7641 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7642 BPF_LD_MAP_FD(BPF_REG_1, 0), 7643 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7644 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7645 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7646 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 7647 sizeof(struct other_val) - 4), 7648 BPF_LD_MAP_FD(BPF_REG_1, 0), 7649 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7650 BPF_EXIT_INSN(), 7651 }, 7652 .fixup_map_hash_16b = { 3, 9 }, 7653 .result = REJECT, 7654 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 7655 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7656 }, 7657 { 7658 "map helper access to adjusted map (via const imm): out-of-bound 2", 7659 .insns = { 7660 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7661 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7662 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7663 BPF_LD_MAP_FD(BPF_REG_1, 0), 7664 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7665 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7666 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7667 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 7668 BPF_LD_MAP_FD(BPF_REG_1, 0), 7669 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7670 BPF_EXIT_INSN(), 7671 }, 7672 .fixup_map_hash_16b = { 3, 9 }, 7673 .result = REJECT, 7674 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 7675 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7676 }, 7677 { 7678 "map helper access to adjusted map (via const reg)", 7679 .insns = { 7680 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7681 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7682 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7683 BPF_LD_MAP_FD(BPF_REG_1, 0), 7684 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7685 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7686 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7687 BPF_MOV64_IMM(BPF_REG_3, 7688 offsetof(struct other_val, bar)), 7689 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7690 BPF_LD_MAP_FD(BPF_REG_1, 0), 7691 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7692 BPF_EXIT_INSN(), 7693 }, 7694 .fixup_map_hash_16b = { 3, 10 }, 7695 .result = ACCEPT, 7696 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7697 }, 7698 { 7699 "map helper access to adjusted map (via const reg): out-of-bound 1", 7700 .insns = { 7701 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7702 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7703 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7704 BPF_LD_MAP_FD(BPF_REG_1, 0), 7705 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7706 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7707 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7708 BPF_MOV64_IMM(BPF_REG_3, 7709 sizeof(struct other_val) - 4), 7710 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7711 BPF_LD_MAP_FD(BPF_REG_1, 0), 7712 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7713 BPF_EXIT_INSN(), 7714 }, 7715 .fixup_map_hash_16b = { 3, 10 }, 7716 .result = REJECT, 7717 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 7718 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7719 }, 7720 { 7721 "map helper access to adjusted map (via const reg): out-of-bound 2", 7722 .insns = { 7723 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7724 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7725 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7726 BPF_LD_MAP_FD(BPF_REG_1, 0), 7727 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7728 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7730 BPF_MOV64_IMM(BPF_REG_3, -4), 7731 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7732 BPF_LD_MAP_FD(BPF_REG_1, 0), 7733 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7734 BPF_EXIT_INSN(), 7735 }, 7736 .fixup_map_hash_16b = { 3, 10 }, 7737 .result = REJECT, 7738 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 7739 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7740 }, 7741 { 7742 "map helper access to adjusted map (via variable)", 7743 .insns = { 7744 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7745 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7746 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7747 BPF_LD_MAP_FD(BPF_REG_1, 0), 7748 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7749 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7750 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7751 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7752 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7753 offsetof(struct other_val, bar), 4), 7754 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7755 BPF_LD_MAP_FD(BPF_REG_1, 0), 7756 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7757 BPF_EXIT_INSN(), 7758 }, 7759 .fixup_map_hash_16b = { 3, 11 }, 7760 .result = ACCEPT, 7761 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7762 }, 7763 { 7764 "map helper access to adjusted map (via variable): no max check", 7765 .insns = { 7766 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7767 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7768 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7769 BPF_LD_MAP_FD(BPF_REG_1, 0), 7770 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7771 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7772 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7773 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7774 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7775 BPF_LD_MAP_FD(BPF_REG_1, 0), 7776 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7777 BPF_EXIT_INSN(), 7778 }, 7779 .fixup_map_hash_16b = { 3, 10 }, 7780 .result = REJECT, 7781 .errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map", 7782 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7783 }, 7784 { 7785 "map helper access to adjusted map (via variable): wrong max check", 7786 .insns = { 7787 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7788 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7789 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7790 BPF_LD_MAP_FD(BPF_REG_1, 0), 7791 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7792 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7793 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 7794 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 7795 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 7796 offsetof(struct other_val, bar) + 1, 4), 7797 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 7798 BPF_LD_MAP_FD(BPF_REG_1, 0), 7799 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7800 BPF_EXIT_INSN(), 7801 }, 7802 .fixup_map_hash_16b = { 3, 11 }, 7803 .result = REJECT, 7804 .errstr = "invalid access to map value, value_size=16 off=9 size=8", 7805 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 7806 }, 7807 { 7808 "map element value is preserved across register spilling", 7809 .insns = { 7810 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7811 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7812 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7813 BPF_LD_MAP_FD(BPF_REG_1, 0), 7814 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7815 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7816 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7817 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7818 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 7819 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7820 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7821 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7822 BPF_EXIT_INSN(), 7823 }, 7824 .fixup_map_hash_48b = { 3 }, 7825 .errstr_unpriv = "R0 leaks addr", 7826 .result = ACCEPT, 7827 .result_unpriv = REJECT, 7828 }, 7829 { 7830 "map element value or null is marked on register spilling", 7831 .insns = { 7832 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7833 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7834 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7835 BPF_LD_MAP_FD(BPF_REG_1, 0), 7836 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7837 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7838 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152), 7839 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 7840 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7841 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 7842 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 7843 BPF_EXIT_INSN(), 7844 }, 7845 .fixup_map_hash_48b = { 3 }, 7846 .errstr_unpriv = "R0 leaks addr", 7847 .result = ACCEPT, 7848 .result_unpriv = REJECT, 7849 }, 7850 { 7851 "map element value store of cleared call register", 7852 .insns = { 7853 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7854 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7855 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7856 BPF_LD_MAP_FD(BPF_REG_1, 0), 7857 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7858 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 7859 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 7860 BPF_EXIT_INSN(), 7861 }, 7862 .fixup_map_hash_48b = { 3 }, 7863 .errstr_unpriv = "R1 !read_ok", 7864 .errstr = "R1 !read_ok", 7865 .result = REJECT, 7866 .result_unpriv = REJECT, 7867 }, 7868 { 7869 "map element value with unaligned store", 7870 .insns = { 7871 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7872 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7873 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7874 BPF_LD_MAP_FD(BPF_REG_1, 0), 7875 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7876 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17), 7877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 7878 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 7879 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43), 7880 BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44), 7881 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 7882 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32), 7883 BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33), 7884 BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34), 7885 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5), 7886 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22), 7887 BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23), 7888 BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24), 7889 BPF_MOV64_REG(BPF_REG_7, BPF_REG_8), 7890 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3), 7891 BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22), 7892 BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23), 7893 BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24), 7894 BPF_EXIT_INSN(), 7895 }, 7896 .fixup_map_hash_48b = { 3 }, 7897 .errstr_unpriv = "R0 leaks addr", 7898 .result = ACCEPT, 7899 .result_unpriv = REJECT, 7900 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7901 }, 7902 { 7903 "map element value with unaligned load", 7904 .insns = { 7905 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7906 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7907 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7908 BPF_LD_MAP_FD(BPF_REG_1, 0), 7909 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7910 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 7911 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 7912 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9), 7913 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 7914 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 7915 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2), 7916 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 7917 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0), 7918 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2), 7919 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5), 7920 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 7921 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4), 7922 BPF_EXIT_INSN(), 7923 }, 7924 .fixup_map_hash_48b = { 3 }, 7925 .errstr_unpriv = "R0 leaks addr", 7926 .result = ACCEPT, 7927 .result_unpriv = REJECT, 7928 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 7929 }, 7930 { 7931 "map element value illegal alu op, 1", 7932 .insns = { 7933 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7934 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7935 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7936 BPF_LD_MAP_FD(BPF_REG_1, 0), 7937 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7938 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7939 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8), 7940 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7941 BPF_EXIT_INSN(), 7942 }, 7943 .fixup_map_hash_48b = { 3 }, 7944 .errstr = "R0 bitwise operator &= on pointer", 7945 .result = REJECT, 7946 }, 7947 { 7948 "map element value illegal alu op, 2", 7949 .insns = { 7950 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7951 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7952 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7953 BPF_LD_MAP_FD(BPF_REG_1, 0), 7954 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7955 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7956 BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0), 7957 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7958 BPF_EXIT_INSN(), 7959 }, 7960 .fixup_map_hash_48b = { 3 }, 7961 .errstr = "R0 32-bit pointer arithmetic prohibited", 7962 .result = REJECT, 7963 }, 7964 { 7965 "map element value illegal alu op, 3", 7966 .insns = { 7967 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7968 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7969 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7970 BPF_LD_MAP_FD(BPF_REG_1, 0), 7971 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7972 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7973 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42), 7974 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7975 BPF_EXIT_INSN(), 7976 }, 7977 .fixup_map_hash_48b = { 3 }, 7978 .errstr = "R0 pointer arithmetic with /= operator", 7979 .result = REJECT, 7980 }, 7981 { 7982 "map element value illegal alu op, 4", 7983 .insns = { 7984 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7985 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7986 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 7987 BPF_LD_MAP_FD(BPF_REG_1, 0), 7988 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 7989 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 7990 BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64), 7991 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 7992 BPF_EXIT_INSN(), 7993 }, 7994 .fixup_map_hash_48b = { 3 }, 7995 .errstr_unpriv = "R0 pointer arithmetic prohibited", 7996 .errstr = "invalid mem access 'inv'", 7997 .result = REJECT, 7998 .result_unpriv = REJECT, 7999 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8000 }, 8001 { 8002 "map element value illegal alu op, 5", 8003 .insns = { 8004 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8005 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8006 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8007 BPF_LD_MAP_FD(BPF_REG_1, 0), 8008 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8009 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8010 BPF_MOV64_IMM(BPF_REG_3, 4096), 8011 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8012 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8013 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8014 BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0), 8015 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0), 8016 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 8017 BPF_EXIT_INSN(), 8018 }, 8019 .fixup_map_hash_48b = { 3 }, 8020 .errstr = "R0 invalid mem access 'inv'", 8021 .result = REJECT, 8022 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8023 }, 8024 { 8025 "map element value is preserved across register spilling", 8026 .insns = { 8027 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8028 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8029 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8030 BPF_LD_MAP_FD(BPF_REG_1, 0), 8031 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8032 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8033 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8034 offsetof(struct test_val, foo)), 8035 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 8036 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8037 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 8038 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 8039 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 8040 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 8041 BPF_EXIT_INSN(), 8042 }, 8043 .fixup_map_hash_48b = { 3 }, 8044 .errstr_unpriv = "R0 leaks addr", 8045 .result = ACCEPT, 8046 .result_unpriv = REJECT, 8047 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8048 }, 8049 { 8050 "helper access to variable memory: stack, bitwise AND + JMP, correct bounds", 8051 .insns = { 8052 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8053 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8054 BPF_MOV64_IMM(BPF_REG_0, 0), 8055 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8056 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8057 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8058 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8059 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8060 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8061 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8062 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8063 BPF_MOV64_IMM(BPF_REG_2, 16), 8064 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8065 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8066 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8067 BPF_MOV64_IMM(BPF_REG_4, 0), 8068 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8069 BPF_MOV64_IMM(BPF_REG_3, 0), 8070 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8071 BPF_MOV64_IMM(BPF_REG_0, 0), 8072 BPF_EXIT_INSN(), 8073 }, 8074 .result = ACCEPT, 8075 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8076 }, 8077 { 8078 "helper access to variable memory: stack, bitwise AND, zero included", 8079 .insns = { 8080 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8081 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8082 BPF_MOV64_IMM(BPF_REG_2, 16), 8083 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8084 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8085 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8086 BPF_MOV64_IMM(BPF_REG_3, 0), 8087 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8088 BPF_EXIT_INSN(), 8089 }, 8090 .errstr = "invalid indirect read from stack off -64+0 size 64", 8091 .result = REJECT, 8092 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8093 }, 8094 { 8095 "helper access to variable memory: stack, bitwise AND + JMP, wrong max", 8096 .insns = { 8097 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8098 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8099 BPF_MOV64_IMM(BPF_REG_2, 16), 8100 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8101 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8102 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65), 8103 BPF_MOV64_IMM(BPF_REG_4, 0), 8104 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8105 BPF_MOV64_IMM(BPF_REG_3, 0), 8106 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8107 BPF_MOV64_IMM(BPF_REG_0, 0), 8108 BPF_EXIT_INSN(), 8109 }, 8110 .errstr = "invalid stack type R1 off=-64 access_size=65", 8111 .result = REJECT, 8112 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8113 }, 8114 { 8115 "helper access to variable memory: stack, JMP, correct bounds", 8116 .insns = { 8117 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8118 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8119 BPF_MOV64_IMM(BPF_REG_0, 0), 8120 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8121 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8122 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8123 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8124 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8125 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8126 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8127 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8128 BPF_MOV64_IMM(BPF_REG_2, 16), 8129 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8130 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8131 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4), 8132 BPF_MOV64_IMM(BPF_REG_4, 0), 8133 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8134 BPF_MOV64_IMM(BPF_REG_3, 0), 8135 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8136 BPF_MOV64_IMM(BPF_REG_0, 0), 8137 BPF_EXIT_INSN(), 8138 }, 8139 .result = ACCEPT, 8140 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8141 }, 8142 { 8143 "helper access to variable memory: stack, JMP (signed), correct bounds", 8144 .insns = { 8145 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8146 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8147 BPF_MOV64_IMM(BPF_REG_0, 0), 8148 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8149 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8150 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8151 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8152 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8153 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8154 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8155 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8156 BPF_MOV64_IMM(BPF_REG_2, 16), 8157 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8158 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8159 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4), 8160 BPF_MOV64_IMM(BPF_REG_4, 0), 8161 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8162 BPF_MOV64_IMM(BPF_REG_3, 0), 8163 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8164 BPF_MOV64_IMM(BPF_REG_0, 0), 8165 BPF_EXIT_INSN(), 8166 }, 8167 .result = ACCEPT, 8168 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8169 }, 8170 { 8171 "helper access to variable memory: stack, JMP, bounds + offset", 8172 .insns = { 8173 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8174 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8175 BPF_MOV64_IMM(BPF_REG_2, 16), 8176 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8177 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8178 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5), 8179 BPF_MOV64_IMM(BPF_REG_4, 0), 8180 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3), 8181 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 8182 BPF_MOV64_IMM(BPF_REG_3, 0), 8183 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8184 BPF_MOV64_IMM(BPF_REG_0, 0), 8185 BPF_EXIT_INSN(), 8186 }, 8187 .errstr = "invalid stack type R1 off=-64 access_size=65", 8188 .result = REJECT, 8189 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8190 }, 8191 { 8192 "helper access to variable memory: stack, JMP, wrong max", 8193 .insns = { 8194 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8195 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8196 BPF_MOV64_IMM(BPF_REG_2, 16), 8197 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8198 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8199 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4), 8200 BPF_MOV64_IMM(BPF_REG_4, 0), 8201 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8202 BPF_MOV64_IMM(BPF_REG_3, 0), 8203 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8204 BPF_MOV64_IMM(BPF_REG_0, 0), 8205 BPF_EXIT_INSN(), 8206 }, 8207 .errstr = "invalid stack type R1 off=-64 access_size=65", 8208 .result = REJECT, 8209 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8210 }, 8211 { 8212 "helper access to variable memory: stack, JMP, no max check", 8213 .insns = { 8214 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8215 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8216 BPF_MOV64_IMM(BPF_REG_2, 16), 8217 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8218 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8219 BPF_MOV64_IMM(BPF_REG_4, 0), 8220 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 8221 BPF_MOV64_IMM(BPF_REG_3, 0), 8222 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8223 BPF_MOV64_IMM(BPF_REG_0, 0), 8224 BPF_EXIT_INSN(), 8225 }, 8226 /* because max wasn't checked, signed min is negative */ 8227 .errstr = "R2 min value is negative, either use unsigned or 'var &= const'", 8228 .result = REJECT, 8229 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8230 }, 8231 { 8232 "helper access to variable memory: stack, JMP, no min check", 8233 .insns = { 8234 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8235 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8236 BPF_MOV64_IMM(BPF_REG_2, 16), 8237 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8238 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8239 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3), 8240 BPF_MOV64_IMM(BPF_REG_3, 0), 8241 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8242 BPF_MOV64_IMM(BPF_REG_0, 0), 8243 BPF_EXIT_INSN(), 8244 }, 8245 .errstr = "invalid indirect read from stack off -64+0 size 64", 8246 .result = REJECT, 8247 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8248 }, 8249 { 8250 "helper access to variable memory: stack, JMP (signed), no min check", 8251 .insns = { 8252 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8254 BPF_MOV64_IMM(BPF_REG_2, 16), 8255 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 8256 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 8257 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3), 8258 BPF_MOV64_IMM(BPF_REG_3, 0), 8259 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8260 BPF_MOV64_IMM(BPF_REG_0, 0), 8261 BPF_EXIT_INSN(), 8262 }, 8263 .errstr = "R2 min value is negative", 8264 .result = REJECT, 8265 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8266 }, 8267 { 8268 "helper access to variable memory: map, JMP, correct bounds", 8269 .insns = { 8270 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8271 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8272 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8273 BPF_LD_MAP_FD(BPF_REG_1, 0), 8274 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8275 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 8276 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8277 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8278 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8279 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8280 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8281 sizeof(struct test_val), 4), 8282 BPF_MOV64_IMM(BPF_REG_4, 0), 8283 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8284 BPF_MOV64_IMM(BPF_REG_3, 0), 8285 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8286 BPF_MOV64_IMM(BPF_REG_0, 0), 8287 BPF_EXIT_INSN(), 8288 }, 8289 .fixup_map_hash_48b = { 3 }, 8290 .result = ACCEPT, 8291 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8292 }, 8293 { 8294 "helper access to variable memory: map, JMP, wrong max", 8295 .insns = { 8296 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8297 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8298 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8299 BPF_LD_MAP_FD(BPF_REG_1, 0), 8300 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8301 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 8302 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8303 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8304 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8305 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8306 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8307 sizeof(struct test_val) + 1, 4), 8308 BPF_MOV64_IMM(BPF_REG_4, 0), 8309 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8310 BPF_MOV64_IMM(BPF_REG_3, 0), 8311 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8312 BPF_MOV64_IMM(BPF_REG_0, 0), 8313 BPF_EXIT_INSN(), 8314 }, 8315 .fixup_map_hash_48b = { 3 }, 8316 .errstr = "invalid access to map value, value_size=48 off=0 size=49", 8317 .result = REJECT, 8318 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8319 }, 8320 { 8321 "helper access to variable memory: map adjusted, JMP, correct bounds", 8322 .insns = { 8323 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8324 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8325 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8326 BPF_LD_MAP_FD(BPF_REG_1, 0), 8327 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8328 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 8329 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8330 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 8331 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8332 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8333 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8334 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8335 sizeof(struct test_val) - 20, 4), 8336 BPF_MOV64_IMM(BPF_REG_4, 0), 8337 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8338 BPF_MOV64_IMM(BPF_REG_3, 0), 8339 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8340 BPF_MOV64_IMM(BPF_REG_0, 0), 8341 BPF_EXIT_INSN(), 8342 }, 8343 .fixup_map_hash_48b = { 3 }, 8344 .result = ACCEPT, 8345 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8346 }, 8347 { 8348 "helper access to variable memory: map adjusted, JMP, wrong max", 8349 .insns = { 8350 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8351 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8352 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8353 BPF_LD_MAP_FD(BPF_REG_1, 0), 8354 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8355 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 8356 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8357 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 8358 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 8359 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8360 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8361 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 8362 sizeof(struct test_val) - 19, 4), 8363 BPF_MOV64_IMM(BPF_REG_4, 0), 8364 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 8365 BPF_MOV64_IMM(BPF_REG_3, 0), 8366 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8367 BPF_MOV64_IMM(BPF_REG_0, 0), 8368 BPF_EXIT_INSN(), 8369 }, 8370 .fixup_map_hash_48b = { 3 }, 8371 .errstr = "R1 min value is outside of the array range", 8372 .result = REJECT, 8373 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8374 }, 8375 { 8376 "helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 8377 .insns = { 8378 BPF_MOV64_IMM(BPF_REG_1, 0), 8379 BPF_MOV64_IMM(BPF_REG_2, 0), 8380 BPF_MOV64_IMM(BPF_REG_3, 0), 8381 BPF_MOV64_IMM(BPF_REG_4, 0), 8382 BPF_MOV64_IMM(BPF_REG_5, 0), 8383 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8384 BPF_EXIT_INSN(), 8385 }, 8386 .result = ACCEPT, 8387 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8388 }, 8389 { 8390 "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 8391 .insns = { 8392 BPF_MOV64_IMM(BPF_REG_1, 0), 8393 BPF_MOV64_IMM(BPF_REG_2, 1), 8394 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8395 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8396 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 8397 BPF_MOV64_IMM(BPF_REG_3, 0), 8398 BPF_MOV64_IMM(BPF_REG_4, 0), 8399 BPF_MOV64_IMM(BPF_REG_5, 0), 8400 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8401 BPF_EXIT_INSN(), 8402 }, 8403 .errstr = "R1 type=inv expected=fp", 8404 .result = REJECT, 8405 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8406 }, 8407 { 8408 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 8409 .insns = { 8410 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8411 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8412 BPF_MOV64_IMM(BPF_REG_2, 0), 8413 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 8414 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8), 8415 BPF_MOV64_IMM(BPF_REG_3, 0), 8416 BPF_MOV64_IMM(BPF_REG_4, 0), 8417 BPF_MOV64_IMM(BPF_REG_5, 0), 8418 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8419 BPF_EXIT_INSN(), 8420 }, 8421 .result = ACCEPT, 8422 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8423 }, 8424 { 8425 "helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 8426 .insns = { 8427 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8428 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8429 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8430 BPF_LD_MAP_FD(BPF_REG_1, 0), 8431 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8432 BPF_FUNC_map_lookup_elem), 8433 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8434 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8435 BPF_MOV64_IMM(BPF_REG_2, 0), 8436 BPF_MOV64_IMM(BPF_REG_3, 0), 8437 BPF_MOV64_IMM(BPF_REG_4, 0), 8438 BPF_MOV64_IMM(BPF_REG_5, 0), 8439 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8440 BPF_EXIT_INSN(), 8441 }, 8442 .fixup_map_hash_8b = { 3 }, 8443 .result = ACCEPT, 8444 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8445 }, 8446 { 8447 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 8448 .insns = { 8449 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8450 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8451 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8452 BPF_LD_MAP_FD(BPF_REG_1, 0), 8453 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8454 BPF_FUNC_map_lookup_elem), 8455 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 8456 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8457 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7), 8458 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8459 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8460 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 8461 BPF_MOV64_IMM(BPF_REG_3, 0), 8462 BPF_MOV64_IMM(BPF_REG_4, 0), 8463 BPF_MOV64_IMM(BPF_REG_5, 0), 8464 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8465 BPF_EXIT_INSN(), 8466 }, 8467 .fixup_map_hash_8b = { 3 }, 8468 .result = ACCEPT, 8469 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8470 }, 8471 { 8472 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 8473 .insns = { 8474 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8475 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8476 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8477 BPF_LD_MAP_FD(BPF_REG_1, 0), 8478 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8479 BPF_FUNC_map_lookup_elem), 8480 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 8481 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8482 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8483 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8484 BPF_MOV64_IMM(BPF_REG_3, 0), 8485 BPF_MOV64_IMM(BPF_REG_4, 0), 8486 BPF_MOV64_IMM(BPF_REG_5, 0), 8487 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8488 BPF_EXIT_INSN(), 8489 }, 8490 .fixup_map_hash_8b = { 3 }, 8491 .result = ACCEPT, 8492 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8493 }, 8494 { 8495 "helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)", 8496 .insns = { 8497 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 8498 offsetof(struct __sk_buff, data)), 8499 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8500 offsetof(struct __sk_buff, data_end)), 8501 BPF_MOV64_REG(BPF_REG_0, BPF_REG_6), 8502 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8503 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 8504 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 8505 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0), 8506 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8507 BPF_MOV64_IMM(BPF_REG_3, 0), 8508 BPF_MOV64_IMM(BPF_REG_4, 0), 8509 BPF_MOV64_IMM(BPF_REG_5, 0), 8510 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 8511 BPF_EXIT_INSN(), 8512 }, 8513 .result = ACCEPT, 8514 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8515 .retval = 0 /* csum_diff of 64-byte packet */, 8516 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8517 }, 8518 { 8519 "helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 8520 .insns = { 8521 BPF_MOV64_IMM(BPF_REG_1, 0), 8522 BPF_MOV64_IMM(BPF_REG_2, 0), 8523 BPF_MOV64_IMM(BPF_REG_3, 0), 8524 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8525 BPF_EXIT_INSN(), 8526 }, 8527 .errstr = "R1 type=inv expected=fp", 8528 .result = REJECT, 8529 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8530 }, 8531 { 8532 "helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 8533 .insns = { 8534 BPF_MOV64_IMM(BPF_REG_1, 0), 8535 BPF_MOV64_IMM(BPF_REG_2, 1), 8536 BPF_MOV64_IMM(BPF_REG_3, 0), 8537 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8538 BPF_EXIT_INSN(), 8539 }, 8540 .errstr = "R1 type=inv expected=fp", 8541 .result = REJECT, 8542 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8543 }, 8544 { 8545 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8546 .insns = { 8547 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8548 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8549 BPF_MOV64_IMM(BPF_REG_2, 0), 8550 BPF_MOV64_IMM(BPF_REG_3, 0), 8551 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8552 BPF_EXIT_INSN(), 8553 }, 8554 .result = ACCEPT, 8555 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8556 }, 8557 { 8558 "helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8559 .insns = { 8560 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8561 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8562 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8563 BPF_LD_MAP_FD(BPF_REG_1, 0), 8564 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8565 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8566 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8567 BPF_MOV64_IMM(BPF_REG_2, 0), 8568 BPF_MOV64_IMM(BPF_REG_3, 0), 8569 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8570 BPF_EXIT_INSN(), 8571 }, 8572 .fixup_map_hash_8b = { 3 }, 8573 .result = ACCEPT, 8574 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8575 }, 8576 { 8577 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8578 .insns = { 8579 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8580 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8581 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8582 BPF_LD_MAP_FD(BPF_REG_1, 0), 8583 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8584 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8585 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8586 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 8587 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8588 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 8589 BPF_MOV64_IMM(BPF_REG_3, 0), 8590 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8591 BPF_EXIT_INSN(), 8592 }, 8593 .fixup_map_hash_8b = { 3 }, 8594 .result = ACCEPT, 8595 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8596 }, 8597 { 8598 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 8599 .insns = { 8600 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8601 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8602 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8603 BPF_LD_MAP_FD(BPF_REG_1, 0), 8604 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8605 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 8606 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8607 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 8608 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2), 8609 BPF_MOV64_IMM(BPF_REG_3, 0), 8610 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8611 BPF_EXIT_INSN(), 8612 }, 8613 .fixup_map_hash_8b = { 3 }, 8614 .result = ACCEPT, 8615 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8616 }, 8617 { 8618 "helper access to variable memory: 8 bytes leak", 8619 .insns = { 8620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8621 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8622 BPF_MOV64_IMM(BPF_REG_0, 0), 8623 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8624 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8625 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8626 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8627 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8628 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8629 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8630 BPF_MOV64_IMM(BPF_REG_2, 1), 8631 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 8632 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 8633 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63), 8634 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 8635 BPF_MOV64_IMM(BPF_REG_3, 0), 8636 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8637 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8638 BPF_EXIT_INSN(), 8639 }, 8640 .errstr = "invalid indirect read from stack off -64+32 size 64", 8641 .result = REJECT, 8642 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8643 }, 8644 { 8645 "helper access to variable memory: 8 bytes no leak (init memory)", 8646 .insns = { 8647 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8648 BPF_MOV64_IMM(BPF_REG_0, 0), 8649 BPF_MOV64_IMM(BPF_REG_0, 0), 8650 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 8651 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 8652 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 8653 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 8654 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 8655 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 8656 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 8657 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 8658 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 8659 BPF_MOV64_IMM(BPF_REG_2, 0), 8660 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32), 8661 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32), 8662 BPF_MOV64_IMM(BPF_REG_3, 0), 8663 BPF_EMIT_CALL(BPF_FUNC_probe_read), 8664 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 8665 BPF_EXIT_INSN(), 8666 }, 8667 .result = ACCEPT, 8668 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 8669 }, 8670 { 8671 "invalid and of negative number", 8672 .insns = { 8673 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8674 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8675 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8676 BPF_LD_MAP_FD(BPF_REG_1, 0), 8677 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8678 BPF_FUNC_map_lookup_elem), 8679 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 8680 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8681 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4), 8682 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 8683 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8684 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 8685 offsetof(struct test_val, foo)), 8686 BPF_EXIT_INSN(), 8687 }, 8688 .fixup_map_hash_48b = { 3 }, 8689 .errstr = "R0 max value is outside of the array range", 8690 .result = REJECT, 8691 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8692 }, 8693 { 8694 "invalid range check", 8695 .insns = { 8696 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8697 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8698 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8699 BPF_LD_MAP_FD(BPF_REG_1, 0), 8700 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8701 BPF_FUNC_map_lookup_elem), 8702 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12), 8703 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 8704 BPF_MOV64_IMM(BPF_REG_9, 1), 8705 BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2), 8706 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), 8707 BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1), 8708 BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1), 8709 BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1), 8710 BPF_MOV32_IMM(BPF_REG_3, 1), 8711 BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9), 8712 BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000), 8713 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 8714 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0), 8715 BPF_MOV64_REG(BPF_REG_0, 0), 8716 BPF_EXIT_INSN(), 8717 }, 8718 .fixup_map_hash_48b = { 3 }, 8719 .errstr = "R0 max value is outside of the array range", 8720 .result = REJECT, 8721 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8722 }, 8723 { 8724 "map in map access", 8725 .insns = { 8726 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8727 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8728 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8729 BPF_LD_MAP_FD(BPF_REG_1, 0), 8730 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8731 BPF_FUNC_map_lookup_elem), 8732 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 8733 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8734 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8735 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8736 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8737 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8738 BPF_FUNC_map_lookup_elem), 8739 BPF_MOV64_IMM(BPF_REG_0, 0), 8740 BPF_EXIT_INSN(), 8741 }, 8742 .fixup_map_in_map = { 3 }, 8743 .result = ACCEPT, 8744 }, 8745 { 8746 "invalid inner map pointer", 8747 .insns = { 8748 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8749 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8750 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8751 BPF_LD_MAP_FD(BPF_REG_1, 0), 8752 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8753 BPF_FUNC_map_lookup_elem), 8754 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 8755 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8756 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8757 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8758 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8759 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8760 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8761 BPF_FUNC_map_lookup_elem), 8762 BPF_MOV64_IMM(BPF_REG_0, 0), 8763 BPF_EXIT_INSN(), 8764 }, 8765 .fixup_map_in_map = { 3 }, 8766 .errstr = "R1 pointer arithmetic on map_ptr prohibited", 8767 .result = REJECT, 8768 }, 8769 { 8770 "forgot null checking on the inner map pointer", 8771 .insns = { 8772 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8773 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8774 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8775 BPF_LD_MAP_FD(BPF_REG_1, 0), 8776 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8777 BPF_FUNC_map_lookup_elem), 8778 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 8779 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8780 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 8781 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 8782 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8783 BPF_FUNC_map_lookup_elem), 8784 BPF_MOV64_IMM(BPF_REG_0, 0), 8785 BPF_EXIT_INSN(), 8786 }, 8787 .fixup_map_in_map = { 3 }, 8788 .errstr = "R1 type=map_value_or_null expected=map_ptr", 8789 .result = REJECT, 8790 }, 8791 { 8792 "ld_abs: check calling conv, r1", 8793 .insns = { 8794 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8795 BPF_MOV64_IMM(BPF_REG_1, 0), 8796 BPF_LD_ABS(BPF_W, -0x200000), 8797 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8798 BPF_EXIT_INSN(), 8799 }, 8800 .errstr = "R1 !read_ok", 8801 .result = REJECT, 8802 }, 8803 { 8804 "ld_abs: check calling conv, r2", 8805 .insns = { 8806 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8807 BPF_MOV64_IMM(BPF_REG_2, 0), 8808 BPF_LD_ABS(BPF_W, -0x200000), 8809 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8810 BPF_EXIT_INSN(), 8811 }, 8812 .errstr = "R2 !read_ok", 8813 .result = REJECT, 8814 }, 8815 { 8816 "ld_abs: check calling conv, r3", 8817 .insns = { 8818 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8819 BPF_MOV64_IMM(BPF_REG_3, 0), 8820 BPF_LD_ABS(BPF_W, -0x200000), 8821 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8822 BPF_EXIT_INSN(), 8823 }, 8824 .errstr = "R3 !read_ok", 8825 .result = REJECT, 8826 }, 8827 { 8828 "ld_abs: check calling conv, r4", 8829 .insns = { 8830 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8831 BPF_MOV64_IMM(BPF_REG_4, 0), 8832 BPF_LD_ABS(BPF_W, -0x200000), 8833 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8834 BPF_EXIT_INSN(), 8835 }, 8836 .errstr = "R4 !read_ok", 8837 .result = REJECT, 8838 }, 8839 { 8840 "ld_abs: check calling conv, r5", 8841 .insns = { 8842 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8843 BPF_MOV64_IMM(BPF_REG_5, 0), 8844 BPF_LD_ABS(BPF_W, -0x200000), 8845 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 8846 BPF_EXIT_INSN(), 8847 }, 8848 .errstr = "R5 !read_ok", 8849 .result = REJECT, 8850 }, 8851 { 8852 "ld_abs: check calling conv, r7", 8853 .insns = { 8854 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8855 BPF_MOV64_IMM(BPF_REG_7, 0), 8856 BPF_LD_ABS(BPF_W, -0x200000), 8857 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 8858 BPF_EXIT_INSN(), 8859 }, 8860 .result = ACCEPT, 8861 }, 8862 { 8863 "ld_abs: tests on r6 and skb data reload helper", 8864 .insns = { 8865 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8866 BPF_LD_ABS(BPF_B, 0), 8867 BPF_LD_ABS(BPF_H, 0), 8868 BPF_LD_ABS(BPF_W, 0), 8869 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 8870 BPF_MOV64_IMM(BPF_REG_6, 0), 8871 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 8872 BPF_MOV64_IMM(BPF_REG_2, 1), 8873 BPF_MOV64_IMM(BPF_REG_3, 2), 8874 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8875 BPF_FUNC_skb_vlan_push), 8876 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 8877 BPF_LD_ABS(BPF_B, 0), 8878 BPF_LD_ABS(BPF_H, 0), 8879 BPF_LD_ABS(BPF_W, 0), 8880 BPF_MOV64_IMM(BPF_REG_0, 42), 8881 BPF_EXIT_INSN(), 8882 }, 8883 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8884 .result = ACCEPT, 8885 .retval = 42 /* ultimate return value */, 8886 }, 8887 { 8888 "ld_ind: check calling conv, r1", 8889 .insns = { 8890 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8891 BPF_MOV64_IMM(BPF_REG_1, 1), 8892 BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000), 8893 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 8894 BPF_EXIT_INSN(), 8895 }, 8896 .errstr = "R1 !read_ok", 8897 .result = REJECT, 8898 }, 8899 { 8900 "ld_ind: check calling conv, r2", 8901 .insns = { 8902 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8903 BPF_MOV64_IMM(BPF_REG_2, 1), 8904 BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000), 8905 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8906 BPF_EXIT_INSN(), 8907 }, 8908 .errstr = "R2 !read_ok", 8909 .result = REJECT, 8910 }, 8911 { 8912 "ld_ind: check calling conv, r3", 8913 .insns = { 8914 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8915 BPF_MOV64_IMM(BPF_REG_3, 1), 8916 BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000), 8917 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8918 BPF_EXIT_INSN(), 8919 }, 8920 .errstr = "R3 !read_ok", 8921 .result = REJECT, 8922 }, 8923 { 8924 "ld_ind: check calling conv, r4", 8925 .insns = { 8926 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8927 BPF_MOV64_IMM(BPF_REG_4, 1), 8928 BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000), 8929 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8930 BPF_EXIT_INSN(), 8931 }, 8932 .errstr = "R4 !read_ok", 8933 .result = REJECT, 8934 }, 8935 { 8936 "ld_ind: check calling conv, r5", 8937 .insns = { 8938 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8939 BPF_MOV64_IMM(BPF_REG_5, 1), 8940 BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000), 8941 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 8942 BPF_EXIT_INSN(), 8943 }, 8944 .errstr = "R5 !read_ok", 8945 .result = REJECT, 8946 }, 8947 { 8948 "ld_ind: check calling conv, r7", 8949 .insns = { 8950 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8951 BPF_MOV64_IMM(BPF_REG_7, 1), 8952 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 8953 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 8954 BPF_EXIT_INSN(), 8955 }, 8956 .result = ACCEPT, 8957 .retval = 1, 8958 }, 8959 { 8960 "check bpf_perf_event_data->sample_period byte load permitted", 8961 .insns = { 8962 BPF_MOV64_IMM(BPF_REG_0, 0), 8963 #if __BYTE_ORDER == __LITTLE_ENDIAN 8964 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 8965 offsetof(struct bpf_perf_event_data, sample_period)), 8966 #else 8967 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 8968 offsetof(struct bpf_perf_event_data, sample_period) + 7), 8969 #endif 8970 BPF_EXIT_INSN(), 8971 }, 8972 .result = ACCEPT, 8973 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8974 }, 8975 { 8976 "check bpf_perf_event_data->sample_period half load permitted", 8977 .insns = { 8978 BPF_MOV64_IMM(BPF_REG_0, 0), 8979 #if __BYTE_ORDER == __LITTLE_ENDIAN 8980 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8981 offsetof(struct bpf_perf_event_data, sample_period)), 8982 #else 8983 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 8984 offsetof(struct bpf_perf_event_data, sample_period) + 6), 8985 #endif 8986 BPF_EXIT_INSN(), 8987 }, 8988 .result = ACCEPT, 8989 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 8990 }, 8991 { 8992 "check bpf_perf_event_data->sample_period word load permitted", 8993 .insns = { 8994 BPF_MOV64_IMM(BPF_REG_0, 0), 8995 #if __BYTE_ORDER == __LITTLE_ENDIAN 8996 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 8997 offsetof(struct bpf_perf_event_data, sample_period)), 8998 #else 8999 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9000 offsetof(struct bpf_perf_event_data, sample_period) + 4), 9001 #endif 9002 BPF_EXIT_INSN(), 9003 }, 9004 .result = ACCEPT, 9005 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9006 }, 9007 { 9008 "check bpf_perf_event_data->sample_period dword load permitted", 9009 .insns = { 9010 BPF_MOV64_IMM(BPF_REG_0, 0), 9011 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 9012 offsetof(struct bpf_perf_event_data, sample_period)), 9013 BPF_EXIT_INSN(), 9014 }, 9015 .result = ACCEPT, 9016 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 9017 }, 9018 { 9019 "check skb->data half load not permitted", 9020 .insns = { 9021 BPF_MOV64_IMM(BPF_REG_0, 0), 9022 #if __BYTE_ORDER == __LITTLE_ENDIAN 9023 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9024 offsetof(struct __sk_buff, data)), 9025 #else 9026 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9027 offsetof(struct __sk_buff, data) + 2), 9028 #endif 9029 BPF_EXIT_INSN(), 9030 }, 9031 .result = REJECT, 9032 .errstr = "invalid bpf_context access", 9033 }, 9034 { 9035 "check skb->tc_classid half load not permitted for lwt prog", 9036 .insns = { 9037 BPF_MOV64_IMM(BPF_REG_0, 0), 9038 #if __BYTE_ORDER == __LITTLE_ENDIAN 9039 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9040 offsetof(struct __sk_buff, tc_classid)), 9041 #else 9042 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 9043 offsetof(struct __sk_buff, tc_classid) + 2), 9044 #endif 9045 BPF_EXIT_INSN(), 9046 }, 9047 .result = REJECT, 9048 .errstr = "invalid bpf_context access", 9049 .prog_type = BPF_PROG_TYPE_LWT_IN, 9050 }, 9051 { 9052 "bounds checks mixing signed and unsigned, positive bounds", 9053 .insns = { 9054 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9055 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9056 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9057 BPF_LD_MAP_FD(BPF_REG_1, 0), 9058 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9059 BPF_FUNC_map_lookup_elem), 9060 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9061 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9062 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9063 BPF_MOV64_IMM(BPF_REG_2, 2), 9064 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 3), 9065 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 4, 2), 9066 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9067 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9068 BPF_MOV64_IMM(BPF_REG_0, 0), 9069 BPF_EXIT_INSN(), 9070 }, 9071 .fixup_map_hash_8b = { 3 }, 9072 .errstr = "unbounded min value", 9073 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9074 .result = REJECT, 9075 }, 9076 { 9077 "bounds checks mixing signed and unsigned", 9078 .insns = { 9079 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9080 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9081 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9082 BPF_LD_MAP_FD(BPF_REG_1, 0), 9083 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9084 BPF_FUNC_map_lookup_elem), 9085 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9086 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9087 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9088 BPF_MOV64_IMM(BPF_REG_2, -1), 9089 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 9090 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9091 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9092 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9093 BPF_MOV64_IMM(BPF_REG_0, 0), 9094 BPF_EXIT_INSN(), 9095 }, 9096 .fixup_map_hash_8b = { 3 }, 9097 .errstr = "unbounded min value", 9098 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9099 .result = REJECT, 9100 }, 9101 { 9102 "bounds checks mixing signed and unsigned, variant 2", 9103 .insns = { 9104 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9105 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9106 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9107 BPF_LD_MAP_FD(BPF_REG_1, 0), 9108 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9109 BPF_FUNC_map_lookup_elem), 9110 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9111 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9112 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9113 BPF_MOV64_IMM(BPF_REG_2, -1), 9114 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 9115 BPF_MOV64_IMM(BPF_REG_8, 0), 9116 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_1), 9117 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 9118 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 9119 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 9120 BPF_MOV64_IMM(BPF_REG_0, 0), 9121 BPF_EXIT_INSN(), 9122 }, 9123 .fixup_map_hash_8b = { 3 }, 9124 .errstr = "unbounded min value", 9125 .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", 9126 .result = REJECT, 9127 }, 9128 { 9129 "bounds checks mixing signed and unsigned, variant 3", 9130 .insns = { 9131 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9132 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9133 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9134 BPF_LD_MAP_FD(BPF_REG_1, 0), 9135 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9136 BPF_FUNC_map_lookup_elem), 9137 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9138 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9139 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9140 BPF_MOV64_IMM(BPF_REG_2, -1), 9141 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 4), 9142 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 9143 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 9144 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 9145 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 9146 BPF_MOV64_IMM(BPF_REG_0, 0), 9147 BPF_EXIT_INSN(), 9148 }, 9149 .fixup_map_hash_8b = { 3 }, 9150 .errstr = "unbounded min value", 9151 .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", 9152 .result = REJECT, 9153 }, 9154 { 9155 "bounds checks mixing signed and unsigned, variant 4", 9156 .insns = { 9157 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9158 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9159 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9160 BPF_LD_MAP_FD(BPF_REG_1, 0), 9161 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9162 BPF_FUNC_map_lookup_elem), 9163 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9164 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9165 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9166 BPF_MOV64_IMM(BPF_REG_2, 1), 9167 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 9168 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9169 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9170 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9171 BPF_MOV64_IMM(BPF_REG_0, 0), 9172 BPF_EXIT_INSN(), 9173 }, 9174 .fixup_map_hash_8b = { 3 }, 9175 .result = ACCEPT, 9176 }, 9177 { 9178 "bounds checks mixing signed and unsigned, variant 5", 9179 .insns = { 9180 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9181 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9182 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9183 BPF_LD_MAP_FD(BPF_REG_1, 0), 9184 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9185 BPF_FUNC_map_lookup_elem), 9186 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9187 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9188 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9189 BPF_MOV64_IMM(BPF_REG_2, -1), 9190 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 9191 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 4), 9192 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 4), 9193 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9194 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9195 BPF_MOV64_IMM(BPF_REG_0, 0), 9196 BPF_EXIT_INSN(), 9197 }, 9198 .fixup_map_hash_8b = { 3 }, 9199 .errstr = "unbounded min value", 9200 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9201 .result = REJECT, 9202 }, 9203 { 9204 "bounds checks mixing signed and unsigned, variant 6", 9205 .insns = { 9206 BPF_MOV64_IMM(BPF_REG_2, 0), 9207 BPF_MOV64_REG(BPF_REG_3, BPF_REG_10), 9208 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -512), 9209 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9210 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -16), 9211 BPF_MOV64_IMM(BPF_REG_6, -1), 9212 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_6, 5), 9213 BPF_JMP_IMM(BPF_JSGT, BPF_REG_4, 1, 4), 9214 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 9215 BPF_MOV64_IMM(BPF_REG_5, 0), 9216 BPF_ST_MEM(BPF_H, BPF_REG_10, -512, 0), 9217 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9218 BPF_FUNC_skb_load_bytes), 9219 BPF_MOV64_IMM(BPF_REG_0, 0), 9220 BPF_EXIT_INSN(), 9221 }, 9222 .errstr = "R4 min value is negative, either use unsigned", 9223 .result = REJECT, 9224 }, 9225 { 9226 "bounds checks mixing signed and unsigned, variant 7", 9227 .insns = { 9228 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9229 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9230 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9231 BPF_LD_MAP_FD(BPF_REG_1, 0), 9232 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9233 BPF_FUNC_map_lookup_elem), 9234 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 9235 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9236 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9237 BPF_MOV64_IMM(BPF_REG_2, 1024 * 1024 * 1024), 9238 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 9239 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9240 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9241 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9242 BPF_MOV64_IMM(BPF_REG_0, 0), 9243 BPF_EXIT_INSN(), 9244 }, 9245 .fixup_map_hash_8b = { 3 }, 9246 .result = ACCEPT, 9247 }, 9248 { 9249 "bounds checks mixing signed and unsigned, variant 8", 9250 .insns = { 9251 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9252 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9254 BPF_LD_MAP_FD(BPF_REG_1, 0), 9255 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9256 BPF_FUNC_map_lookup_elem), 9257 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9258 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9259 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9260 BPF_MOV64_IMM(BPF_REG_2, -1), 9261 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9262 BPF_MOV64_IMM(BPF_REG_0, 0), 9263 BPF_EXIT_INSN(), 9264 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9265 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9266 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9267 BPF_MOV64_IMM(BPF_REG_0, 0), 9268 BPF_EXIT_INSN(), 9269 }, 9270 .fixup_map_hash_8b = { 3 }, 9271 .errstr = "unbounded min value", 9272 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9273 .result = REJECT, 9274 }, 9275 { 9276 "bounds checks mixing signed and unsigned, variant 9", 9277 .insns = { 9278 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9279 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9280 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9281 BPF_LD_MAP_FD(BPF_REG_1, 0), 9282 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9283 BPF_FUNC_map_lookup_elem), 9284 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 9285 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9286 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9287 BPF_LD_IMM64(BPF_REG_2, -9223372036854775808ULL), 9288 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9289 BPF_MOV64_IMM(BPF_REG_0, 0), 9290 BPF_EXIT_INSN(), 9291 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9292 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9293 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9294 BPF_MOV64_IMM(BPF_REG_0, 0), 9295 BPF_EXIT_INSN(), 9296 }, 9297 .fixup_map_hash_8b = { 3 }, 9298 .result = ACCEPT, 9299 }, 9300 { 9301 "bounds checks mixing signed and unsigned, variant 10", 9302 .insns = { 9303 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9304 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9305 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9306 BPF_LD_MAP_FD(BPF_REG_1, 0), 9307 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9308 BPF_FUNC_map_lookup_elem), 9309 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9310 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9311 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9312 BPF_MOV64_IMM(BPF_REG_2, 0), 9313 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 9314 BPF_MOV64_IMM(BPF_REG_0, 0), 9315 BPF_EXIT_INSN(), 9316 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9317 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9318 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9319 BPF_MOV64_IMM(BPF_REG_0, 0), 9320 BPF_EXIT_INSN(), 9321 }, 9322 .fixup_map_hash_8b = { 3 }, 9323 .errstr = "unbounded min value", 9324 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9325 .result = REJECT, 9326 }, 9327 { 9328 "bounds checks mixing signed and unsigned, variant 11", 9329 .insns = { 9330 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9331 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9332 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9333 BPF_LD_MAP_FD(BPF_REG_1, 0), 9334 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9335 BPF_FUNC_map_lookup_elem), 9336 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9337 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9338 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9339 BPF_MOV64_IMM(BPF_REG_2, -1), 9340 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9341 /* Dead branch. */ 9342 BPF_MOV64_IMM(BPF_REG_0, 0), 9343 BPF_EXIT_INSN(), 9344 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9345 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9346 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9347 BPF_MOV64_IMM(BPF_REG_0, 0), 9348 BPF_EXIT_INSN(), 9349 }, 9350 .fixup_map_hash_8b = { 3 }, 9351 .errstr = "unbounded min value", 9352 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9353 .result = REJECT, 9354 }, 9355 { 9356 "bounds checks mixing signed and unsigned, variant 12", 9357 .insns = { 9358 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9359 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9360 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9361 BPF_LD_MAP_FD(BPF_REG_1, 0), 9362 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9363 BPF_FUNC_map_lookup_elem), 9364 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9365 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9366 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9367 BPF_MOV64_IMM(BPF_REG_2, -6), 9368 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9369 BPF_MOV64_IMM(BPF_REG_0, 0), 9370 BPF_EXIT_INSN(), 9371 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9372 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9373 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9374 BPF_MOV64_IMM(BPF_REG_0, 0), 9375 BPF_EXIT_INSN(), 9376 }, 9377 .fixup_map_hash_8b = { 3 }, 9378 .errstr = "unbounded min value", 9379 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9380 .result = REJECT, 9381 }, 9382 { 9383 "bounds checks mixing signed and unsigned, variant 13", 9384 .insns = { 9385 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9386 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9387 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9388 BPF_LD_MAP_FD(BPF_REG_1, 0), 9389 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9390 BPF_FUNC_map_lookup_elem), 9391 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9392 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9393 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9394 BPF_MOV64_IMM(BPF_REG_2, 2), 9395 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9396 BPF_MOV64_IMM(BPF_REG_7, 1), 9397 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 0, 2), 9398 BPF_MOV64_IMM(BPF_REG_0, 0), 9399 BPF_EXIT_INSN(), 9400 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_1), 9401 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 4, 2), 9402 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_7), 9403 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9404 BPF_MOV64_IMM(BPF_REG_0, 0), 9405 BPF_EXIT_INSN(), 9406 }, 9407 .fixup_map_hash_8b = { 3 }, 9408 .errstr = "unbounded min value", 9409 .errstr_unpriv = "R7 has unknown scalar with mixed signed bounds", 9410 .result = REJECT, 9411 }, 9412 { 9413 "bounds checks mixing signed and unsigned, variant 14", 9414 .insns = { 9415 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 9416 offsetof(struct __sk_buff, mark)), 9417 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9418 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9419 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9420 BPF_LD_MAP_FD(BPF_REG_1, 0), 9421 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9422 BPF_FUNC_map_lookup_elem), 9423 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9424 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9425 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9426 BPF_MOV64_IMM(BPF_REG_2, -1), 9427 BPF_MOV64_IMM(BPF_REG_8, 2), 9428 BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 42, 6), 9429 BPF_JMP_REG(BPF_JSGT, BPF_REG_8, BPF_REG_1, 3), 9430 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 9431 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9432 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9433 BPF_MOV64_IMM(BPF_REG_0, 0), 9434 BPF_EXIT_INSN(), 9435 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, -3), 9436 BPF_JMP_IMM(BPF_JA, 0, 0, -7), 9437 }, 9438 .fixup_map_hash_8b = { 4 }, 9439 .errstr = "unbounded min value", 9440 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9441 .result = REJECT, 9442 }, 9443 { 9444 "bounds checks mixing signed and unsigned, variant 15", 9445 .insns = { 9446 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9447 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9448 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9449 BPF_LD_MAP_FD(BPF_REG_1, 0), 9450 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9451 BPF_FUNC_map_lookup_elem), 9452 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9453 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 9454 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 9455 BPF_MOV64_IMM(BPF_REG_2, -6), 9456 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 9457 BPF_MOV64_IMM(BPF_REG_0, 0), 9458 BPF_EXIT_INSN(), 9459 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9460 BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 1, 2), 9461 BPF_MOV64_IMM(BPF_REG_0, 0), 9462 BPF_EXIT_INSN(), 9463 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 9464 BPF_MOV64_IMM(BPF_REG_0, 0), 9465 BPF_EXIT_INSN(), 9466 }, 9467 .fixup_map_hash_8b = { 3 }, 9468 .errstr = "unbounded min value", 9469 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9470 .result = REJECT, 9471 .result_unpriv = REJECT, 9472 }, 9473 { 9474 "subtraction bounds (map value) variant 1", 9475 .insns = { 9476 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9477 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9478 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9479 BPF_LD_MAP_FD(BPF_REG_1, 0), 9480 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9481 BPF_FUNC_map_lookup_elem), 9482 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9483 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9484 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 7), 9485 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 9486 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 5), 9487 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 9488 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 56), 9489 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9490 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9491 BPF_EXIT_INSN(), 9492 BPF_MOV64_IMM(BPF_REG_0, 0), 9493 BPF_EXIT_INSN(), 9494 }, 9495 .fixup_map_hash_8b = { 3 }, 9496 .errstr = "R0 max value is outside of the array range", 9497 .result = REJECT, 9498 }, 9499 { 9500 "subtraction bounds (map value) variant 2", 9501 .insns = { 9502 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9503 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9504 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9505 BPF_LD_MAP_FD(BPF_REG_1, 0), 9506 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9507 BPF_FUNC_map_lookup_elem), 9508 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 9509 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9510 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 6), 9511 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 9512 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 4), 9513 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 9514 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9515 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9516 BPF_EXIT_INSN(), 9517 BPF_MOV64_IMM(BPF_REG_0, 0), 9518 BPF_EXIT_INSN(), 9519 }, 9520 .fixup_map_hash_8b = { 3 }, 9521 .errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.", 9522 .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", 9523 .result = REJECT, 9524 }, 9525 { 9526 "check subtraction on pointers for unpriv", 9527 .insns = { 9528 BPF_MOV64_IMM(BPF_REG_0, 0), 9529 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 9530 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 9531 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), 9532 BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 9), 9533 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9534 BPF_FUNC_map_lookup_elem), 9535 BPF_MOV64_REG(BPF_REG_9, BPF_REG_FP), 9536 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_0), 9537 BPF_LD_MAP_FD(BPF_REG_ARG1, 0), 9538 BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), 9539 BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), 9540 BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 0), 9541 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9542 BPF_FUNC_map_lookup_elem), 9543 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9544 BPF_EXIT_INSN(), 9545 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 9546 BPF_MOV64_IMM(BPF_REG_0, 0), 9547 BPF_EXIT_INSN(), 9548 }, 9549 .fixup_map_hash_8b = { 1, 9 }, 9550 .result = ACCEPT, 9551 .result_unpriv = REJECT, 9552 .errstr_unpriv = "R9 pointer -= pointer prohibited", 9553 }, 9554 { 9555 "bounds check based on zero-extended MOV", 9556 .insns = { 9557 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9558 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9559 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9560 BPF_LD_MAP_FD(BPF_REG_1, 0), 9561 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9562 BPF_FUNC_map_lookup_elem), 9563 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9564 /* r2 = 0x0000'0000'ffff'ffff */ 9565 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff), 9566 /* r2 = 0 */ 9567 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 9568 /* no-op */ 9569 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9570 /* access at offset 0 */ 9571 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9572 /* exit */ 9573 BPF_MOV64_IMM(BPF_REG_0, 0), 9574 BPF_EXIT_INSN(), 9575 }, 9576 .fixup_map_hash_8b = { 3 }, 9577 .result = ACCEPT 9578 }, 9579 { 9580 "bounds check based on sign-extended MOV. test1", 9581 .insns = { 9582 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9583 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9584 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9585 BPF_LD_MAP_FD(BPF_REG_1, 0), 9586 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9587 BPF_FUNC_map_lookup_elem), 9588 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9589 /* r2 = 0xffff'ffff'ffff'ffff */ 9590 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 9591 /* r2 = 0xffff'ffff */ 9592 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 9593 /* r0 = <oob pointer> */ 9594 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9595 /* access to OOB pointer */ 9596 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9597 /* exit */ 9598 BPF_MOV64_IMM(BPF_REG_0, 0), 9599 BPF_EXIT_INSN(), 9600 }, 9601 .fixup_map_hash_8b = { 3 }, 9602 .errstr = "map_value pointer and 4294967295", 9603 .result = REJECT 9604 }, 9605 { 9606 "bounds check based on sign-extended MOV. test2", 9607 .insns = { 9608 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9609 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9610 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9611 BPF_LD_MAP_FD(BPF_REG_1, 0), 9612 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9613 BPF_FUNC_map_lookup_elem), 9614 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9615 /* r2 = 0xffff'ffff'ffff'ffff */ 9616 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 9617 /* r2 = 0xfff'ffff */ 9618 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36), 9619 /* r0 = <oob pointer> */ 9620 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9621 /* access to OOB pointer */ 9622 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9623 /* exit */ 9624 BPF_MOV64_IMM(BPF_REG_0, 0), 9625 BPF_EXIT_INSN(), 9626 }, 9627 .fixup_map_hash_8b = { 3 }, 9628 .errstr = "R0 min value is outside of the array range", 9629 .result = REJECT 9630 }, 9631 { 9632 "bounds check based on reg_off + var_off + insn_off. test1", 9633 .insns = { 9634 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 9635 offsetof(struct __sk_buff, mark)), 9636 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9637 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9638 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9639 BPF_LD_MAP_FD(BPF_REG_1, 0), 9640 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9641 BPF_FUNC_map_lookup_elem), 9642 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9643 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 9644 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1), 9645 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 9646 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 9647 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 9648 BPF_MOV64_IMM(BPF_REG_0, 0), 9649 BPF_EXIT_INSN(), 9650 }, 9651 .fixup_map_hash_8b = { 4 }, 9652 .errstr = "value_size=8 off=1073741825", 9653 .result = REJECT, 9654 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9655 }, 9656 { 9657 "bounds check based on reg_off + var_off + insn_off. test2", 9658 .insns = { 9659 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 9660 offsetof(struct __sk_buff, mark)), 9661 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9662 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9663 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9664 BPF_LD_MAP_FD(BPF_REG_1, 0), 9665 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9666 BPF_FUNC_map_lookup_elem), 9667 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 9668 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 9669 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1), 9670 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 9671 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 9672 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 9673 BPF_MOV64_IMM(BPF_REG_0, 0), 9674 BPF_EXIT_INSN(), 9675 }, 9676 .fixup_map_hash_8b = { 4 }, 9677 .errstr = "value 1073741823", 9678 .result = REJECT, 9679 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9680 }, 9681 { 9682 "bounds check after truncation of non-boundary-crossing range", 9683 .insns = { 9684 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9685 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9686 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9687 BPF_LD_MAP_FD(BPF_REG_1, 0), 9688 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9689 BPF_FUNC_map_lookup_elem), 9690 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9691 /* r1 = [0x00, 0xff] */ 9692 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9693 BPF_MOV64_IMM(BPF_REG_2, 1), 9694 /* r2 = 0x10'0000'0000 */ 9695 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36), 9696 /* r1 = [0x10'0000'0000, 0x10'0000'00ff] */ 9697 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 9698 /* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */ 9699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9700 /* r1 = [0x00, 0xff] */ 9701 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff), 9702 /* r1 = 0 */ 9703 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9704 /* no-op */ 9705 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9706 /* access at offset 0 */ 9707 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9708 /* exit */ 9709 BPF_MOV64_IMM(BPF_REG_0, 0), 9710 BPF_EXIT_INSN(), 9711 }, 9712 .fixup_map_hash_8b = { 3 }, 9713 .result = ACCEPT 9714 }, 9715 { 9716 "bounds check after truncation of boundary-crossing range (1)", 9717 .insns = { 9718 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9719 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9720 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9721 BPF_LD_MAP_FD(BPF_REG_1, 0), 9722 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9723 BPF_FUNC_map_lookup_elem), 9724 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9725 /* r1 = [0x00, 0xff] */ 9726 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9727 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9728 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 9729 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9730 /* r1 = [0xffff'ff80, 0xffff'ffff] or 9731 * [0x0000'0000, 0x0000'007f] 9732 */ 9733 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0), 9734 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9735 /* r1 = [0x00, 0xff] or 9736 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 9737 */ 9738 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9739 /* r1 = 0 or 9740 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 9741 */ 9742 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9743 /* no-op or OOB pointer computation */ 9744 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9745 /* potentially OOB access */ 9746 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9747 /* exit */ 9748 BPF_MOV64_IMM(BPF_REG_0, 0), 9749 BPF_EXIT_INSN(), 9750 }, 9751 .fixup_map_hash_8b = { 3 }, 9752 /* not actually fully unbounded, but the bound is very high */ 9753 .errstr = "R0 unbounded memory access", 9754 .result = REJECT 9755 }, 9756 { 9757 "bounds check after truncation of boundary-crossing range (2)", 9758 .insns = { 9759 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9760 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9761 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9762 BPF_LD_MAP_FD(BPF_REG_1, 0), 9763 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9764 BPF_FUNC_map_lookup_elem), 9765 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 9766 /* r1 = [0x00, 0xff] */ 9767 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9768 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9769 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 9770 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 9771 /* r1 = [0xffff'ff80, 0xffff'ffff] or 9772 * [0x0000'0000, 0x0000'007f] 9773 * difference to previous test: truncation via MOV32 9774 * instead of ALU32. 9775 */ 9776 BPF_MOV32_REG(BPF_REG_1, BPF_REG_1), 9777 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9778 /* r1 = [0x00, 0xff] or 9779 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 9780 */ 9781 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 9782 /* r1 = 0 or 9783 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 9784 */ 9785 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9786 /* no-op or OOB pointer computation */ 9787 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9788 /* potentially OOB access */ 9789 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9790 /* exit */ 9791 BPF_MOV64_IMM(BPF_REG_0, 0), 9792 BPF_EXIT_INSN(), 9793 }, 9794 .fixup_map_hash_8b = { 3 }, 9795 /* not actually fully unbounded, but the bound is very high */ 9796 .errstr = "R0 unbounded memory access", 9797 .result = REJECT 9798 }, 9799 { 9800 "bounds check after wrapping 32-bit addition", 9801 .insns = { 9802 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9803 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9804 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9805 BPF_LD_MAP_FD(BPF_REG_1, 0), 9806 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9807 BPF_FUNC_map_lookup_elem), 9808 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 9809 /* r1 = 0x7fff'ffff */ 9810 BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff), 9811 /* r1 = 0xffff'fffe */ 9812 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 9813 /* r1 = 0 */ 9814 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2), 9815 /* no-op */ 9816 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9817 /* access at offset 0 */ 9818 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9819 /* exit */ 9820 BPF_MOV64_IMM(BPF_REG_0, 0), 9821 BPF_EXIT_INSN(), 9822 }, 9823 .fixup_map_hash_8b = { 3 }, 9824 .result = ACCEPT 9825 }, 9826 { 9827 "bounds check after shift with oversized count operand", 9828 .insns = { 9829 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9830 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9831 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9832 BPF_LD_MAP_FD(BPF_REG_1, 0), 9833 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9834 BPF_FUNC_map_lookup_elem), 9835 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9836 BPF_MOV64_IMM(BPF_REG_2, 32), 9837 BPF_MOV64_IMM(BPF_REG_1, 1), 9838 /* r1 = (u32)1 << (u32)32 = ? */ 9839 BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 9840 /* r1 = [0x0000, 0xffff] */ 9841 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff), 9842 /* computes unknown pointer, potentially OOB */ 9843 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9844 /* potentially OOB access */ 9845 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9846 /* exit */ 9847 BPF_MOV64_IMM(BPF_REG_0, 0), 9848 BPF_EXIT_INSN(), 9849 }, 9850 .fixup_map_hash_8b = { 3 }, 9851 .errstr = "R0 max value is outside of the array range", 9852 .result = REJECT 9853 }, 9854 { 9855 "bounds check after right shift of maybe-negative number", 9856 .insns = { 9857 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9858 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9859 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9860 BPF_LD_MAP_FD(BPF_REG_1, 0), 9861 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9862 BPF_FUNC_map_lookup_elem), 9863 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9864 /* r1 = [0x00, 0xff] */ 9865 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 9866 /* r1 = [-0x01, 0xfe] */ 9867 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 9868 /* r1 = 0 or 0xff'ffff'ffff'ffff */ 9869 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9870 /* r1 = 0 or 0xffff'ffff'ffff */ 9871 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 9872 /* computes unknown pointer, potentially OOB */ 9873 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9874 /* potentially OOB access */ 9875 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9876 /* exit */ 9877 BPF_MOV64_IMM(BPF_REG_0, 0), 9878 BPF_EXIT_INSN(), 9879 }, 9880 .fixup_map_hash_8b = { 3 }, 9881 .errstr = "R0 unbounded memory access", 9882 .result = REJECT 9883 }, 9884 { 9885 "bounds check after 32-bit right shift with 64-bit input", 9886 .insns = { 9887 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9888 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9889 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9890 BPF_LD_MAP_FD(BPF_REG_1, 0), 9891 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9892 BPF_FUNC_map_lookup_elem), 9893 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 9894 /* r1 = 2 */ 9895 BPF_MOV64_IMM(BPF_REG_1, 2), 9896 /* r1 = 1<<32 */ 9897 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 31), 9898 /* r1 = 0 (NOT 2!) */ 9899 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 31), 9900 /* r1 = 0xffff'fffe (NOT 0!) */ 9901 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 2), 9902 /* computes OOB pointer */ 9903 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9904 /* OOB access */ 9905 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9906 /* exit */ 9907 BPF_MOV64_IMM(BPF_REG_0, 0), 9908 BPF_EXIT_INSN(), 9909 }, 9910 .fixup_map_hash_8b = { 3 }, 9911 .errstr = "R0 invalid mem access", 9912 .result = REJECT, 9913 }, 9914 { 9915 "bounds check map access with off+size signed 32bit overflow. test1", 9916 .insns = { 9917 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9918 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9919 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9920 BPF_LD_MAP_FD(BPF_REG_1, 0), 9921 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9922 BPF_FUNC_map_lookup_elem), 9923 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9924 BPF_EXIT_INSN(), 9925 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe), 9926 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9927 BPF_JMP_A(0), 9928 BPF_EXIT_INSN(), 9929 }, 9930 .fixup_map_hash_8b = { 3 }, 9931 .errstr = "map_value pointer and 2147483646", 9932 .result = REJECT 9933 }, 9934 { 9935 "bounds check map access with off+size signed 32bit overflow. test2", 9936 .insns = { 9937 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9938 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9939 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9940 BPF_LD_MAP_FD(BPF_REG_1, 0), 9941 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9942 BPF_FUNC_map_lookup_elem), 9943 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9944 BPF_EXIT_INSN(), 9945 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9946 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9947 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 9948 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 9949 BPF_JMP_A(0), 9950 BPF_EXIT_INSN(), 9951 }, 9952 .fixup_map_hash_8b = { 3 }, 9953 .errstr = "pointer offset 1073741822", 9954 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 9955 .result = REJECT 9956 }, 9957 { 9958 "bounds check map access with off+size signed 32bit overflow. test3", 9959 .insns = { 9960 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9961 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9962 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9963 BPF_LD_MAP_FD(BPF_REG_1, 0), 9964 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9965 BPF_FUNC_map_lookup_elem), 9966 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9967 BPF_EXIT_INSN(), 9968 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 9969 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 9970 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 9971 BPF_JMP_A(0), 9972 BPF_EXIT_INSN(), 9973 }, 9974 .fixup_map_hash_8b = { 3 }, 9975 .errstr = "pointer offset -1073741822", 9976 .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", 9977 .result = REJECT 9978 }, 9979 { 9980 "bounds check map access with off+size signed 32bit overflow. test4", 9981 .insns = { 9982 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9983 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9984 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9985 BPF_LD_MAP_FD(BPF_REG_1, 0), 9986 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9987 BPF_FUNC_map_lookup_elem), 9988 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9989 BPF_EXIT_INSN(), 9990 BPF_MOV64_IMM(BPF_REG_1, 1000000), 9991 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000), 9992 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 9993 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 9994 BPF_JMP_A(0), 9995 BPF_EXIT_INSN(), 9996 }, 9997 .fixup_map_hash_8b = { 3 }, 9998 .errstr = "map_value pointer and 1000000000000", 9999 .result = REJECT 10000 }, 10001 { 10002 "pointer/scalar confusion in state equality check (way 1)", 10003 .insns = { 10004 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10005 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10006 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10007 BPF_LD_MAP_FD(BPF_REG_1, 0), 10008 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10009 BPF_FUNC_map_lookup_elem), 10010 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 10011 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10012 BPF_JMP_A(1), 10013 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10014 BPF_JMP_A(0), 10015 BPF_EXIT_INSN(), 10016 }, 10017 .fixup_map_hash_8b = { 3 }, 10018 .result = ACCEPT, 10019 .retval = POINTER_VALUE, 10020 .result_unpriv = REJECT, 10021 .errstr_unpriv = "R0 leaks addr as return value" 10022 }, 10023 { 10024 "pointer/scalar confusion in state equality check (way 2)", 10025 .insns = { 10026 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10027 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10028 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10029 BPF_LD_MAP_FD(BPF_REG_1, 0), 10030 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10031 BPF_FUNC_map_lookup_elem), 10032 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10033 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10034 BPF_JMP_A(1), 10035 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 10036 BPF_EXIT_INSN(), 10037 }, 10038 .fixup_map_hash_8b = { 3 }, 10039 .result = ACCEPT, 10040 .retval = POINTER_VALUE, 10041 .result_unpriv = REJECT, 10042 .errstr_unpriv = "R0 leaks addr as return value" 10043 }, 10044 { 10045 "variable-offset ctx access", 10046 .insns = { 10047 /* Get an unknown value */ 10048 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10049 /* Make it small and 4-byte aligned */ 10050 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10051 /* add it to skb. We now have either &skb->len or 10052 * &skb->pkt_type, but we don't know which 10053 */ 10054 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 10055 /* dereference it */ 10056 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10057 BPF_EXIT_INSN(), 10058 }, 10059 .errstr = "variable ctx access var_off=(0x0; 0x4)", 10060 .result = REJECT, 10061 .prog_type = BPF_PROG_TYPE_LWT_IN, 10062 }, 10063 { 10064 "variable-offset stack access", 10065 .insns = { 10066 /* Fill the top 8 bytes of the stack */ 10067 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10068 /* Get an unknown value */ 10069 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10070 /* Make it small and 4-byte aligned */ 10071 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10072 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 10073 /* add it to fp. We now have either fp-4 or fp-8, but 10074 * we don't know which 10075 */ 10076 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 10077 /* dereference it */ 10078 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0), 10079 BPF_EXIT_INSN(), 10080 }, 10081 .errstr = "variable stack access var_off=(0xfffffffffffffff8; 0x4)", 10082 .result = REJECT, 10083 .prog_type = BPF_PROG_TYPE_LWT_IN, 10084 }, 10085 { 10086 "indirect variable-offset stack access", 10087 .insns = { 10088 /* Fill the top 8 bytes of the stack */ 10089 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10090 /* Get an unknown value */ 10091 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10092 /* Make it small and 4-byte aligned */ 10093 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 10094 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 10095 /* add it to fp. We now have either fp-4 or fp-8, but 10096 * we don't know which 10097 */ 10098 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 10099 /* dereference it indirectly */ 10100 BPF_LD_MAP_FD(BPF_REG_1, 0), 10101 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10102 BPF_FUNC_map_lookup_elem), 10103 BPF_MOV64_IMM(BPF_REG_0, 0), 10104 BPF_EXIT_INSN(), 10105 }, 10106 .fixup_map_hash_8b = { 5 }, 10107 .errstr = "variable stack read R2", 10108 .result = REJECT, 10109 .prog_type = BPF_PROG_TYPE_LWT_IN, 10110 }, 10111 { 10112 "direct stack access with 32-bit wraparound. test1", 10113 .insns = { 10114 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10115 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 10116 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 10117 BPF_MOV32_IMM(BPF_REG_0, 0), 10118 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10119 BPF_EXIT_INSN() 10120 }, 10121 .errstr = "fp pointer and 2147483647", 10122 .result = REJECT 10123 }, 10124 { 10125 "direct stack access with 32-bit wraparound. test2", 10126 .insns = { 10127 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10128 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 10129 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 10130 BPF_MOV32_IMM(BPF_REG_0, 0), 10131 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10132 BPF_EXIT_INSN() 10133 }, 10134 .errstr = "fp pointer and 1073741823", 10135 .result = REJECT 10136 }, 10137 { 10138 "direct stack access with 32-bit wraparound. test3", 10139 .insns = { 10140 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10141 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 10142 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 10143 BPF_MOV32_IMM(BPF_REG_0, 0), 10144 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 10145 BPF_EXIT_INSN() 10146 }, 10147 .errstr = "fp pointer offset 1073741822", 10148 .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", 10149 .result = REJECT 10150 }, 10151 { 10152 "liveness pruning and write screening", 10153 .insns = { 10154 /* Get an unknown value */ 10155 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 10156 /* branch conditions teach us nothing about R2 */ 10157 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 10158 BPF_MOV64_IMM(BPF_REG_0, 0), 10159 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 10160 BPF_MOV64_IMM(BPF_REG_0, 0), 10161 BPF_EXIT_INSN(), 10162 }, 10163 .errstr = "R0 !read_ok", 10164 .result = REJECT, 10165 .prog_type = BPF_PROG_TYPE_LWT_IN, 10166 }, 10167 { 10168 "varlen_map_value_access pruning", 10169 .insns = { 10170 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10171 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10172 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10173 BPF_LD_MAP_FD(BPF_REG_1, 0), 10174 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10175 BPF_FUNC_map_lookup_elem), 10176 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 10177 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 10178 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 10179 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 10180 BPF_MOV32_IMM(BPF_REG_1, 0), 10181 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 10182 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 10183 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 10184 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 10185 offsetof(struct test_val, foo)), 10186 BPF_EXIT_INSN(), 10187 }, 10188 .fixup_map_hash_48b = { 3 }, 10189 .errstr_unpriv = "R0 leaks addr", 10190 .errstr = "R0 unbounded memory access", 10191 .result_unpriv = REJECT, 10192 .result = REJECT, 10193 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10194 }, 10195 { 10196 "invalid 64-bit BPF_END", 10197 .insns = { 10198 BPF_MOV32_IMM(BPF_REG_0, 0), 10199 { 10200 .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 10201 .dst_reg = BPF_REG_0, 10202 .src_reg = 0, 10203 .off = 0, 10204 .imm = 32, 10205 }, 10206 BPF_EXIT_INSN(), 10207 }, 10208 .errstr = "unknown opcode d7", 10209 .result = REJECT, 10210 }, 10211 { 10212 "XDP, using ifindex from netdev", 10213 .insns = { 10214 BPF_MOV64_IMM(BPF_REG_0, 0), 10215 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10216 offsetof(struct xdp_md, ingress_ifindex)), 10217 BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 1, 1), 10218 BPF_MOV64_IMM(BPF_REG_0, 1), 10219 BPF_EXIT_INSN(), 10220 }, 10221 .result = ACCEPT, 10222 .prog_type = BPF_PROG_TYPE_XDP, 10223 .retval = 1, 10224 }, 10225 { 10226 "meta access, test1", 10227 .insns = { 10228 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10229 offsetof(struct xdp_md, data_meta)), 10230 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10231 offsetof(struct xdp_md, data)), 10232 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10233 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10234 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10235 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10236 BPF_MOV64_IMM(BPF_REG_0, 0), 10237 BPF_EXIT_INSN(), 10238 }, 10239 .result = ACCEPT, 10240 .prog_type = BPF_PROG_TYPE_XDP, 10241 }, 10242 { 10243 "meta access, test2", 10244 .insns = { 10245 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10246 offsetof(struct xdp_md, data_meta)), 10247 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10248 offsetof(struct xdp_md, data)), 10249 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10250 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8), 10251 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10252 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10253 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10254 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 10255 BPF_MOV64_IMM(BPF_REG_0, 0), 10256 BPF_EXIT_INSN(), 10257 }, 10258 .result = REJECT, 10259 .errstr = "invalid access to packet, off=-8", 10260 .prog_type = BPF_PROG_TYPE_XDP, 10261 }, 10262 { 10263 "meta access, test3", 10264 .insns = { 10265 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10266 offsetof(struct xdp_md, data_meta)), 10267 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10268 offsetof(struct xdp_md, data_end)), 10269 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 10270 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10271 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10272 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10273 BPF_MOV64_IMM(BPF_REG_0, 0), 10274 BPF_EXIT_INSN(), 10275 }, 10276 .result = REJECT, 10277 .errstr = "invalid access to packet", 10278 .prog_type = BPF_PROG_TYPE_XDP, 10279 }, 10280 { 10281 "meta access, test4", 10282 .insns = { 10283 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10284 offsetof(struct xdp_md, data_meta)), 10285 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10286 offsetof(struct xdp_md, data_end)), 10287 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10288 offsetof(struct xdp_md, data)), 10289 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 10290 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10291 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 10292 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10293 BPF_MOV64_IMM(BPF_REG_0, 0), 10294 BPF_EXIT_INSN(), 10295 }, 10296 .result = REJECT, 10297 .errstr = "invalid access to packet", 10298 .prog_type = BPF_PROG_TYPE_XDP, 10299 }, 10300 { 10301 "meta access, test5", 10302 .insns = { 10303 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10304 offsetof(struct xdp_md, data_meta)), 10305 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10306 offsetof(struct xdp_md, data)), 10307 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10308 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10309 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3), 10310 BPF_MOV64_IMM(BPF_REG_2, -8), 10311 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10312 BPF_FUNC_xdp_adjust_meta), 10313 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 10314 BPF_MOV64_IMM(BPF_REG_0, 0), 10315 BPF_EXIT_INSN(), 10316 }, 10317 .result = REJECT, 10318 .errstr = "R3 !read_ok", 10319 .prog_type = BPF_PROG_TYPE_XDP, 10320 }, 10321 { 10322 "meta access, test6", 10323 .insns = { 10324 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10325 offsetof(struct xdp_md, data_meta)), 10326 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10327 offsetof(struct xdp_md, data)), 10328 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10329 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10330 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10331 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10332 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1), 10333 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10334 BPF_MOV64_IMM(BPF_REG_0, 0), 10335 BPF_EXIT_INSN(), 10336 }, 10337 .result = REJECT, 10338 .errstr = "invalid access to packet", 10339 .prog_type = BPF_PROG_TYPE_XDP, 10340 }, 10341 { 10342 "meta access, test7", 10343 .insns = { 10344 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10345 offsetof(struct xdp_md, data_meta)), 10346 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10347 offsetof(struct xdp_md, data)), 10348 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 10349 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 10350 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10351 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 10352 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10353 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10354 BPF_MOV64_IMM(BPF_REG_0, 0), 10355 BPF_EXIT_INSN(), 10356 }, 10357 .result = ACCEPT, 10358 .prog_type = BPF_PROG_TYPE_XDP, 10359 }, 10360 { 10361 "meta access, test8", 10362 .insns = { 10363 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10364 offsetof(struct xdp_md, data_meta)), 10365 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10366 offsetof(struct xdp_md, data)), 10367 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10368 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 10369 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10370 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10371 BPF_MOV64_IMM(BPF_REG_0, 0), 10372 BPF_EXIT_INSN(), 10373 }, 10374 .result = ACCEPT, 10375 .prog_type = BPF_PROG_TYPE_XDP, 10376 }, 10377 { 10378 "meta access, test9", 10379 .insns = { 10380 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10381 offsetof(struct xdp_md, data_meta)), 10382 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10383 offsetof(struct xdp_md, data)), 10384 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 10385 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 10386 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 10387 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 10388 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10389 BPF_MOV64_IMM(BPF_REG_0, 0), 10390 BPF_EXIT_INSN(), 10391 }, 10392 .result = REJECT, 10393 .errstr = "invalid access to packet", 10394 .prog_type = BPF_PROG_TYPE_XDP, 10395 }, 10396 { 10397 "meta access, test10", 10398 .insns = { 10399 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10400 offsetof(struct xdp_md, data_meta)), 10401 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10402 offsetof(struct xdp_md, data)), 10403 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10404 offsetof(struct xdp_md, data_end)), 10405 BPF_MOV64_IMM(BPF_REG_5, 42), 10406 BPF_MOV64_IMM(BPF_REG_6, 24), 10407 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 10408 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 10409 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 10410 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 10411 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5), 10412 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 10413 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 10414 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 10415 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1), 10416 BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 10417 BPF_MOV64_IMM(BPF_REG_0, 0), 10418 BPF_EXIT_INSN(), 10419 }, 10420 .result = REJECT, 10421 .errstr = "invalid access to packet", 10422 .prog_type = BPF_PROG_TYPE_XDP, 10423 }, 10424 { 10425 "meta access, test11", 10426 .insns = { 10427 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10428 offsetof(struct xdp_md, data_meta)), 10429 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10430 offsetof(struct xdp_md, data)), 10431 BPF_MOV64_IMM(BPF_REG_5, 42), 10432 BPF_MOV64_IMM(BPF_REG_6, 24), 10433 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 10434 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 10435 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 10436 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 10437 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5), 10438 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 10439 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 10440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 10441 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1), 10442 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0), 10443 BPF_MOV64_IMM(BPF_REG_0, 0), 10444 BPF_EXIT_INSN(), 10445 }, 10446 .result = ACCEPT, 10447 .prog_type = BPF_PROG_TYPE_XDP, 10448 }, 10449 { 10450 "meta access, test12", 10451 .insns = { 10452 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10453 offsetof(struct xdp_md, data_meta)), 10454 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10455 offsetof(struct xdp_md, data)), 10456 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 10457 offsetof(struct xdp_md, data_end)), 10458 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 10459 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 10460 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5), 10461 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 10462 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 10463 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 10464 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1), 10465 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 10466 BPF_MOV64_IMM(BPF_REG_0, 0), 10467 BPF_EXIT_INSN(), 10468 }, 10469 .result = ACCEPT, 10470 .prog_type = BPF_PROG_TYPE_XDP, 10471 }, 10472 { 10473 "arithmetic ops make PTR_TO_CTX unusable", 10474 .insns = { 10475 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 10476 offsetof(struct __sk_buff, data) - 10477 offsetof(struct __sk_buff, mark)), 10478 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10479 offsetof(struct __sk_buff, mark)), 10480 BPF_EXIT_INSN(), 10481 }, 10482 .errstr = "dereference of modified ctx ptr", 10483 .result = REJECT, 10484 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10485 }, 10486 { 10487 "pkt_end - pkt_start is allowed", 10488 .insns = { 10489 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10490 offsetof(struct __sk_buff, data_end)), 10491 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10492 offsetof(struct __sk_buff, data)), 10493 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 10494 BPF_EXIT_INSN(), 10495 }, 10496 .result = ACCEPT, 10497 .retval = TEST_DATA_LEN, 10498 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10499 }, 10500 { 10501 "XDP pkt read, pkt_end mangling, bad access 1", 10502 .insns = { 10503 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10504 offsetof(struct xdp_md, data)), 10505 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10506 offsetof(struct xdp_md, data_end)), 10507 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10508 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10509 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), 10510 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10511 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10512 BPF_MOV64_IMM(BPF_REG_0, 0), 10513 BPF_EXIT_INSN(), 10514 }, 10515 .errstr = "R3 pointer arithmetic on pkt_end", 10516 .result = REJECT, 10517 .prog_type = BPF_PROG_TYPE_XDP, 10518 }, 10519 { 10520 "XDP pkt read, pkt_end mangling, bad access 2", 10521 .insns = { 10522 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10523 offsetof(struct xdp_md, data)), 10524 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10525 offsetof(struct xdp_md, data_end)), 10526 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10527 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10528 BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), 10529 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10530 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10531 BPF_MOV64_IMM(BPF_REG_0, 0), 10532 BPF_EXIT_INSN(), 10533 }, 10534 .errstr = "R3 pointer arithmetic on pkt_end", 10535 .result = REJECT, 10536 .prog_type = BPF_PROG_TYPE_XDP, 10537 }, 10538 { 10539 "XDP pkt read, pkt_data' > pkt_end, good access", 10540 .insns = { 10541 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10542 offsetof(struct xdp_md, data)), 10543 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10544 offsetof(struct xdp_md, data_end)), 10545 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10546 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10547 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10548 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10549 BPF_MOV64_IMM(BPF_REG_0, 0), 10550 BPF_EXIT_INSN(), 10551 }, 10552 .result = ACCEPT, 10553 .prog_type = BPF_PROG_TYPE_XDP, 10554 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10555 }, 10556 { 10557 "XDP pkt read, pkt_data' > pkt_end, bad access 1", 10558 .insns = { 10559 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10560 offsetof(struct xdp_md, data)), 10561 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10562 offsetof(struct xdp_md, data_end)), 10563 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10564 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10565 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 10566 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10567 BPF_MOV64_IMM(BPF_REG_0, 0), 10568 BPF_EXIT_INSN(), 10569 }, 10570 .errstr = "R1 offset is outside of the packet", 10571 .result = REJECT, 10572 .prog_type = BPF_PROG_TYPE_XDP, 10573 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10574 }, 10575 { 10576 "XDP pkt read, pkt_data' > pkt_end, bad access 2", 10577 .insns = { 10578 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10579 offsetof(struct xdp_md, data)), 10580 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10581 offsetof(struct xdp_md, data_end)), 10582 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10583 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10584 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 10585 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10586 BPF_MOV64_IMM(BPF_REG_0, 0), 10587 BPF_EXIT_INSN(), 10588 }, 10589 .errstr = "R1 offset is outside of the packet", 10590 .result = REJECT, 10591 .prog_type = BPF_PROG_TYPE_XDP, 10592 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10593 }, 10594 { 10595 "XDP pkt read, pkt_end > pkt_data', good access", 10596 .insns = { 10597 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10598 offsetof(struct xdp_md, data)), 10599 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10600 offsetof(struct xdp_md, data_end)), 10601 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10602 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10603 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10604 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10605 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10606 BPF_MOV64_IMM(BPF_REG_0, 0), 10607 BPF_EXIT_INSN(), 10608 }, 10609 .result = ACCEPT, 10610 .prog_type = BPF_PROG_TYPE_XDP, 10611 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10612 }, 10613 { 10614 "XDP pkt read, pkt_end > pkt_data', bad access 1", 10615 .insns = { 10616 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10617 offsetof(struct xdp_md, data)), 10618 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10619 offsetof(struct xdp_md, data_end)), 10620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10621 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10622 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10623 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10624 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10625 BPF_MOV64_IMM(BPF_REG_0, 0), 10626 BPF_EXIT_INSN(), 10627 }, 10628 .errstr = "R1 offset is outside of the packet", 10629 .result = REJECT, 10630 .prog_type = BPF_PROG_TYPE_XDP, 10631 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10632 }, 10633 { 10634 "XDP pkt read, pkt_end > pkt_data', bad access 2", 10635 .insns = { 10636 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10637 offsetof(struct xdp_md, data)), 10638 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10639 offsetof(struct xdp_md, data_end)), 10640 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10641 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10642 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 10643 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10644 BPF_MOV64_IMM(BPF_REG_0, 0), 10645 BPF_EXIT_INSN(), 10646 }, 10647 .errstr = "R1 offset is outside of the packet", 10648 .result = REJECT, 10649 .prog_type = BPF_PROG_TYPE_XDP, 10650 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10651 }, 10652 { 10653 "XDP pkt read, pkt_data' < pkt_end, good access", 10654 .insns = { 10655 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10656 offsetof(struct xdp_md, data)), 10657 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10658 offsetof(struct xdp_md, data_end)), 10659 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10660 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10661 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10662 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10663 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10664 BPF_MOV64_IMM(BPF_REG_0, 0), 10665 BPF_EXIT_INSN(), 10666 }, 10667 .result = ACCEPT, 10668 .prog_type = BPF_PROG_TYPE_XDP, 10669 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10670 }, 10671 { 10672 "XDP pkt read, pkt_data' < pkt_end, bad access 1", 10673 .insns = { 10674 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10675 offsetof(struct xdp_md, data)), 10676 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10677 offsetof(struct xdp_md, data_end)), 10678 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10679 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10680 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10681 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10682 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10683 BPF_MOV64_IMM(BPF_REG_0, 0), 10684 BPF_EXIT_INSN(), 10685 }, 10686 .errstr = "R1 offset is outside of the packet", 10687 .result = REJECT, 10688 .prog_type = BPF_PROG_TYPE_XDP, 10689 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10690 }, 10691 { 10692 "XDP pkt read, pkt_data' < pkt_end, bad access 2", 10693 .insns = { 10694 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10695 offsetof(struct xdp_md, data)), 10696 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10697 offsetof(struct xdp_md, data_end)), 10698 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10700 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 10701 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10702 BPF_MOV64_IMM(BPF_REG_0, 0), 10703 BPF_EXIT_INSN(), 10704 }, 10705 .errstr = "R1 offset is outside of the packet", 10706 .result = REJECT, 10707 .prog_type = BPF_PROG_TYPE_XDP, 10708 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10709 }, 10710 { 10711 "XDP pkt read, pkt_end < pkt_data', good access", 10712 .insns = { 10713 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10714 offsetof(struct xdp_md, data)), 10715 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10716 offsetof(struct xdp_md, data_end)), 10717 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10718 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10719 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10720 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10721 BPF_MOV64_IMM(BPF_REG_0, 0), 10722 BPF_EXIT_INSN(), 10723 }, 10724 .result = ACCEPT, 10725 .prog_type = BPF_PROG_TYPE_XDP, 10726 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10727 }, 10728 { 10729 "XDP pkt read, pkt_end < pkt_data', bad access 1", 10730 .insns = { 10731 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10732 offsetof(struct xdp_md, data)), 10733 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10734 offsetof(struct xdp_md, data_end)), 10735 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10736 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10737 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 10738 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10739 BPF_MOV64_IMM(BPF_REG_0, 0), 10740 BPF_EXIT_INSN(), 10741 }, 10742 .errstr = "R1 offset is outside of the packet", 10743 .result = REJECT, 10744 .prog_type = BPF_PROG_TYPE_XDP, 10745 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10746 }, 10747 { 10748 "XDP pkt read, pkt_end < pkt_data', bad access 2", 10749 .insns = { 10750 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10751 offsetof(struct xdp_md, data)), 10752 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10753 offsetof(struct xdp_md, data_end)), 10754 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10755 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10756 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 10757 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10758 BPF_MOV64_IMM(BPF_REG_0, 0), 10759 BPF_EXIT_INSN(), 10760 }, 10761 .errstr = "R1 offset is outside of the packet", 10762 .result = REJECT, 10763 .prog_type = BPF_PROG_TYPE_XDP, 10764 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10765 }, 10766 { 10767 "XDP pkt read, pkt_data' >= pkt_end, good access", 10768 .insns = { 10769 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10770 offsetof(struct xdp_md, data)), 10771 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10772 offsetof(struct xdp_md, data_end)), 10773 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10774 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10775 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10776 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10777 BPF_MOV64_IMM(BPF_REG_0, 0), 10778 BPF_EXIT_INSN(), 10779 }, 10780 .result = ACCEPT, 10781 .prog_type = BPF_PROG_TYPE_XDP, 10782 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10783 }, 10784 { 10785 "XDP pkt read, pkt_data' >= pkt_end, bad access 1", 10786 .insns = { 10787 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10788 offsetof(struct xdp_md, data)), 10789 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10790 offsetof(struct xdp_md, data_end)), 10791 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10792 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10793 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 10794 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10795 BPF_MOV64_IMM(BPF_REG_0, 0), 10796 BPF_EXIT_INSN(), 10797 }, 10798 .errstr = "R1 offset is outside of the packet", 10799 .result = REJECT, 10800 .prog_type = BPF_PROG_TYPE_XDP, 10801 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10802 }, 10803 { 10804 "XDP pkt read, pkt_data' >= pkt_end, bad access 2", 10805 .insns = { 10806 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10807 offsetof(struct xdp_md, data)), 10808 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10809 offsetof(struct xdp_md, data_end)), 10810 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10811 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10812 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 10813 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10814 BPF_MOV64_IMM(BPF_REG_0, 0), 10815 BPF_EXIT_INSN(), 10816 }, 10817 .errstr = "R1 offset is outside of the packet", 10818 .result = REJECT, 10819 .prog_type = BPF_PROG_TYPE_XDP, 10820 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10821 }, 10822 { 10823 "XDP pkt read, pkt_end >= pkt_data', good access", 10824 .insns = { 10825 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10826 offsetof(struct xdp_md, data)), 10827 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10828 offsetof(struct xdp_md, data_end)), 10829 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10830 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10831 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10832 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10833 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10834 BPF_MOV64_IMM(BPF_REG_0, 0), 10835 BPF_EXIT_INSN(), 10836 }, 10837 .result = ACCEPT, 10838 .prog_type = BPF_PROG_TYPE_XDP, 10839 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10840 }, 10841 { 10842 "XDP pkt read, pkt_end >= pkt_data', bad access 1", 10843 .insns = { 10844 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10845 offsetof(struct xdp_md, data)), 10846 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10847 offsetof(struct xdp_md, data_end)), 10848 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10849 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10850 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10851 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10852 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10853 BPF_MOV64_IMM(BPF_REG_0, 0), 10854 BPF_EXIT_INSN(), 10855 }, 10856 .errstr = "R1 offset is outside of the packet", 10857 .result = REJECT, 10858 .prog_type = BPF_PROG_TYPE_XDP, 10859 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10860 }, 10861 { 10862 "XDP pkt read, pkt_end >= pkt_data', bad access 2", 10863 .insns = { 10864 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10865 offsetof(struct xdp_md, data)), 10866 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10867 offsetof(struct xdp_md, data_end)), 10868 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10869 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10870 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 10871 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10872 BPF_MOV64_IMM(BPF_REG_0, 0), 10873 BPF_EXIT_INSN(), 10874 }, 10875 .errstr = "R1 offset is outside of the packet", 10876 .result = REJECT, 10877 .prog_type = BPF_PROG_TYPE_XDP, 10878 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10879 }, 10880 { 10881 "XDP pkt read, pkt_data' <= pkt_end, good access", 10882 .insns = { 10883 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10884 offsetof(struct xdp_md, data)), 10885 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10886 offsetof(struct xdp_md, data_end)), 10887 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10888 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10889 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10890 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10891 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10892 BPF_MOV64_IMM(BPF_REG_0, 0), 10893 BPF_EXIT_INSN(), 10894 }, 10895 .result = ACCEPT, 10896 .prog_type = BPF_PROG_TYPE_XDP, 10897 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10898 }, 10899 { 10900 "XDP pkt read, pkt_data' <= pkt_end, bad access 1", 10901 .insns = { 10902 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10903 offsetof(struct xdp_md, data)), 10904 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10905 offsetof(struct xdp_md, data_end)), 10906 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10907 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10908 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10909 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10910 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 10911 BPF_MOV64_IMM(BPF_REG_0, 0), 10912 BPF_EXIT_INSN(), 10913 }, 10914 .errstr = "R1 offset is outside of the packet", 10915 .result = REJECT, 10916 .prog_type = BPF_PROG_TYPE_XDP, 10917 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10918 }, 10919 { 10920 "XDP pkt read, pkt_data' <= pkt_end, bad access 2", 10921 .insns = { 10922 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10923 offsetof(struct xdp_md, data)), 10924 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10925 offsetof(struct xdp_md, data_end)), 10926 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10927 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10928 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 10929 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10930 BPF_MOV64_IMM(BPF_REG_0, 0), 10931 BPF_EXIT_INSN(), 10932 }, 10933 .errstr = "R1 offset is outside of the packet", 10934 .result = REJECT, 10935 .prog_type = BPF_PROG_TYPE_XDP, 10936 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10937 }, 10938 { 10939 "XDP pkt read, pkt_end <= pkt_data', good access", 10940 .insns = { 10941 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10942 offsetof(struct xdp_md, data)), 10943 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10944 offsetof(struct xdp_md, data_end)), 10945 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10946 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10947 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10948 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10949 BPF_MOV64_IMM(BPF_REG_0, 0), 10950 BPF_EXIT_INSN(), 10951 }, 10952 .result = ACCEPT, 10953 .prog_type = BPF_PROG_TYPE_XDP, 10954 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10955 }, 10956 { 10957 "XDP pkt read, pkt_end <= pkt_data', bad access 1", 10958 .insns = { 10959 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10960 offsetof(struct xdp_md, data)), 10961 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10962 offsetof(struct xdp_md, data_end)), 10963 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10964 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10965 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 10966 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 10967 BPF_MOV64_IMM(BPF_REG_0, 0), 10968 BPF_EXIT_INSN(), 10969 }, 10970 .errstr = "R1 offset is outside of the packet", 10971 .result = REJECT, 10972 .prog_type = BPF_PROG_TYPE_XDP, 10973 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10974 }, 10975 { 10976 "XDP pkt read, pkt_end <= pkt_data', bad access 2", 10977 .insns = { 10978 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10979 offsetof(struct xdp_md, data)), 10980 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 10981 offsetof(struct xdp_md, data_end)), 10982 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 10983 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 10984 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 10985 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 10986 BPF_MOV64_IMM(BPF_REG_0, 0), 10987 BPF_EXIT_INSN(), 10988 }, 10989 .errstr = "R1 offset is outside of the packet", 10990 .result = REJECT, 10991 .prog_type = BPF_PROG_TYPE_XDP, 10992 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 10993 }, 10994 { 10995 "XDP pkt read, pkt_meta' > pkt_data, good access", 10996 .insns = { 10997 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 10998 offsetof(struct xdp_md, data_meta)), 10999 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11000 offsetof(struct xdp_md, data)), 11001 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11002 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11003 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 11004 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11005 BPF_MOV64_IMM(BPF_REG_0, 0), 11006 BPF_EXIT_INSN(), 11007 }, 11008 .result = ACCEPT, 11009 .prog_type = BPF_PROG_TYPE_XDP, 11010 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11011 }, 11012 { 11013 "XDP pkt read, pkt_meta' > pkt_data, bad access 1", 11014 .insns = { 11015 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11016 offsetof(struct xdp_md, data_meta)), 11017 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11018 offsetof(struct xdp_md, data)), 11019 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11020 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11021 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 11022 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11023 BPF_MOV64_IMM(BPF_REG_0, 0), 11024 BPF_EXIT_INSN(), 11025 }, 11026 .errstr = "R1 offset is outside of the packet", 11027 .result = REJECT, 11028 .prog_type = BPF_PROG_TYPE_XDP, 11029 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11030 }, 11031 { 11032 "XDP pkt read, pkt_meta' > pkt_data, bad access 2", 11033 .insns = { 11034 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11035 offsetof(struct xdp_md, data_meta)), 11036 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11037 offsetof(struct xdp_md, data)), 11038 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11039 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11040 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 11041 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11042 BPF_MOV64_IMM(BPF_REG_0, 0), 11043 BPF_EXIT_INSN(), 11044 }, 11045 .errstr = "R1 offset is outside of the packet", 11046 .result = REJECT, 11047 .prog_type = BPF_PROG_TYPE_XDP, 11048 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11049 }, 11050 { 11051 "XDP pkt read, pkt_data > pkt_meta', good access", 11052 .insns = { 11053 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11054 offsetof(struct xdp_md, data_meta)), 11055 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11056 offsetof(struct xdp_md, data)), 11057 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11058 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11059 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11060 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11061 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11062 BPF_MOV64_IMM(BPF_REG_0, 0), 11063 BPF_EXIT_INSN(), 11064 }, 11065 .result = ACCEPT, 11066 .prog_type = BPF_PROG_TYPE_XDP, 11067 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11068 }, 11069 { 11070 "XDP pkt read, pkt_data > pkt_meta', bad access 1", 11071 .insns = { 11072 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11073 offsetof(struct xdp_md, data_meta)), 11074 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11075 offsetof(struct xdp_md, data)), 11076 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11077 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11078 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11079 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11080 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11081 BPF_MOV64_IMM(BPF_REG_0, 0), 11082 BPF_EXIT_INSN(), 11083 }, 11084 .errstr = "R1 offset is outside of the packet", 11085 .result = REJECT, 11086 .prog_type = BPF_PROG_TYPE_XDP, 11087 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11088 }, 11089 { 11090 "XDP pkt read, pkt_data > pkt_meta', bad access 2", 11091 .insns = { 11092 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11093 offsetof(struct xdp_md, data_meta)), 11094 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11095 offsetof(struct xdp_md, data)), 11096 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11097 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11098 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 11099 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11100 BPF_MOV64_IMM(BPF_REG_0, 0), 11101 BPF_EXIT_INSN(), 11102 }, 11103 .errstr = "R1 offset is outside of the packet", 11104 .result = REJECT, 11105 .prog_type = BPF_PROG_TYPE_XDP, 11106 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11107 }, 11108 { 11109 "XDP pkt read, pkt_meta' < pkt_data, good access", 11110 .insns = { 11111 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11112 offsetof(struct xdp_md, data_meta)), 11113 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11114 offsetof(struct xdp_md, data)), 11115 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11116 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11117 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11118 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11119 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11120 BPF_MOV64_IMM(BPF_REG_0, 0), 11121 BPF_EXIT_INSN(), 11122 }, 11123 .result = ACCEPT, 11124 .prog_type = BPF_PROG_TYPE_XDP, 11125 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11126 }, 11127 { 11128 "XDP pkt read, pkt_meta' < pkt_data, bad access 1", 11129 .insns = { 11130 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11131 offsetof(struct xdp_md, data_meta)), 11132 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11133 offsetof(struct xdp_md, data)), 11134 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11135 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11136 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11137 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11138 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11139 BPF_MOV64_IMM(BPF_REG_0, 0), 11140 BPF_EXIT_INSN(), 11141 }, 11142 .errstr = "R1 offset is outside of the packet", 11143 .result = REJECT, 11144 .prog_type = BPF_PROG_TYPE_XDP, 11145 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11146 }, 11147 { 11148 "XDP pkt read, pkt_meta' < pkt_data, bad access 2", 11149 .insns = { 11150 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11151 offsetof(struct xdp_md, data_meta)), 11152 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11153 offsetof(struct xdp_md, data)), 11154 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11155 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11156 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 11157 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11158 BPF_MOV64_IMM(BPF_REG_0, 0), 11159 BPF_EXIT_INSN(), 11160 }, 11161 .errstr = "R1 offset is outside of the packet", 11162 .result = REJECT, 11163 .prog_type = BPF_PROG_TYPE_XDP, 11164 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11165 }, 11166 { 11167 "XDP pkt read, pkt_data < pkt_meta', good access", 11168 .insns = { 11169 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11170 offsetof(struct xdp_md, data_meta)), 11171 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11172 offsetof(struct xdp_md, data)), 11173 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11174 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11175 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 11176 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11177 BPF_MOV64_IMM(BPF_REG_0, 0), 11178 BPF_EXIT_INSN(), 11179 }, 11180 .result = ACCEPT, 11181 .prog_type = BPF_PROG_TYPE_XDP, 11182 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11183 }, 11184 { 11185 "XDP pkt read, pkt_data < pkt_meta', bad access 1", 11186 .insns = { 11187 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11188 offsetof(struct xdp_md, data_meta)), 11189 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11190 offsetof(struct xdp_md, data)), 11191 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11192 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11193 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 11194 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11195 BPF_MOV64_IMM(BPF_REG_0, 0), 11196 BPF_EXIT_INSN(), 11197 }, 11198 .errstr = "R1 offset is outside of the packet", 11199 .result = REJECT, 11200 .prog_type = BPF_PROG_TYPE_XDP, 11201 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11202 }, 11203 { 11204 "XDP pkt read, pkt_data < pkt_meta', bad access 2", 11205 .insns = { 11206 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11207 offsetof(struct xdp_md, data_meta)), 11208 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11209 offsetof(struct xdp_md, data)), 11210 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11212 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 11213 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11214 BPF_MOV64_IMM(BPF_REG_0, 0), 11215 BPF_EXIT_INSN(), 11216 }, 11217 .errstr = "R1 offset is outside of the packet", 11218 .result = REJECT, 11219 .prog_type = BPF_PROG_TYPE_XDP, 11220 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11221 }, 11222 { 11223 "XDP pkt read, pkt_meta' >= pkt_data, good access", 11224 .insns = { 11225 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11226 offsetof(struct xdp_md, data_meta)), 11227 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11228 offsetof(struct xdp_md, data)), 11229 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11230 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11231 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 11232 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11233 BPF_MOV64_IMM(BPF_REG_0, 0), 11234 BPF_EXIT_INSN(), 11235 }, 11236 .result = ACCEPT, 11237 .prog_type = BPF_PROG_TYPE_XDP, 11238 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11239 }, 11240 { 11241 "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", 11242 .insns = { 11243 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11244 offsetof(struct xdp_md, data_meta)), 11245 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11246 offsetof(struct xdp_md, data)), 11247 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11248 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11249 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 11250 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11251 BPF_MOV64_IMM(BPF_REG_0, 0), 11252 BPF_EXIT_INSN(), 11253 }, 11254 .errstr = "R1 offset is outside of the packet", 11255 .result = REJECT, 11256 .prog_type = BPF_PROG_TYPE_XDP, 11257 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11258 }, 11259 { 11260 "XDP pkt read, pkt_meta' >= pkt_data, bad access 2", 11261 .insns = { 11262 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11263 offsetof(struct xdp_md, data_meta)), 11264 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11265 offsetof(struct xdp_md, data)), 11266 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11267 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11268 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 11269 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11270 BPF_MOV64_IMM(BPF_REG_0, 0), 11271 BPF_EXIT_INSN(), 11272 }, 11273 .errstr = "R1 offset is outside of the packet", 11274 .result = REJECT, 11275 .prog_type = BPF_PROG_TYPE_XDP, 11276 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11277 }, 11278 { 11279 "XDP pkt read, pkt_data >= pkt_meta', good access", 11280 .insns = { 11281 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11282 offsetof(struct xdp_md, data_meta)), 11283 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11284 offsetof(struct xdp_md, data)), 11285 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11286 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11287 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11288 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11289 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11290 BPF_MOV64_IMM(BPF_REG_0, 0), 11291 BPF_EXIT_INSN(), 11292 }, 11293 .result = ACCEPT, 11294 .prog_type = BPF_PROG_TYPE_XDP, 11295 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11296 }, 11297 { 11298 "XDP pkt read, pkt_data >= pkt_meta', bad access 1", 11299 .insns = { 11300 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11301 offsetof(struct xdp_md, data_meta)), 11302 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11303 offsetof(struct xdp_md, data)), 11304 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11305 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11306 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11307 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11308 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11309 BPF_MOV64_IMM(BPF_REG_0, 0), 11310 BPF_EXIT_INSN(), 11311 }, 11312 .errstr = "R1 offset is outside of the packet", 11313 .result = REJECT, 11314 .prog_type = BPF_PROG_TYPE_XDP, 11315 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11316 }, 11317 { 11318 "XDP pkt read, pkt_data >= pkt_meta', bad access 2", 11319 .insns = { 11320 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11321 offsetof(struct xdp_md, data_meta)), 11322 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11323 offsetof(struct xdp_md, data)), 11324 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11325 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11326 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 11327 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11328 BPF_MOV64_IMM(BPF_REG_0, 0), 11329 BPF_EXIT_INSN(), 11330 }, 11331 .errstr = "R1 offset is outside of the packet", 11332 .result = REJECT, 11333 .prog_type = BPF_PROG_TYPE_XDP, 11334 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11335 }, 11336 { 11337 "XDP pkt read, pkt_meta' <= pkt_data, good access", 11338 .insns = { 11339 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11340 offsetof(struct xdp_md, data_meta)), 11341 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11342 offsetof(struct xdp_md, data)), 11343 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11344 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11345 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11346 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11347 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11348 BPF_MOV64_IMM(BPF_REG_0, 0), 11349 BPF_EXIT_INSN(), 11350 }, 11351 .result = ACCEPT, 11352 .prog_type = BPF_PROG_TYPE_XDP, 11353 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11354 }, 11355 { 11356 "XDP pkt read, pkt_meta' <= pkt_data, bad access 1", 11357 .insns = { 11358 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11359 offsetof(struct xdp_md, data_meta)), 11360 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11361 offsetof(struct xdp_md, data)), 11362 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11363 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11364 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11365 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11366 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 11367 BPF_MOV64_IMM(BPF_REG_0, 0), 11368 BPF_EXIT_INSN(), 11369 }, 11370 .errstr = "R1 offset is outside of the packet", 11371 .result = REJECT, 11372 .prog_type = BPF_PROG_TYPE_XDP, 11373 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11374 }, 11375 { 11376 "XDP pkt read, pkt_meta' <= pkt_data, bad access 2", 11377 .insns = { 11378 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11379 offsetof(struct xdp_md, data_meta)), 11380 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11381 offsetof(struct xdp_md, data)), 11382 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11383 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11384 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 11385 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11386 BPF_MOV64_IMM(BPF_REG_0, 0), 11387 BPF_EXIT_INSN(), 11388 }, 11389 .errstr = "R1 offset is outside of the packet", 11390 .result = REJECT, 11391 .prog_type = BPF_PROG_TYPE_XDP, 11392 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11393 }, 11394 { 11395 "XDP pkt read, pkt_data <= pkt_meta', good access", 11396 .insns = { 11397 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11398 offsetof(struct xdp_md, data_meta)), 11399 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11400 offsetof(struct xdp_md, data)), 11401 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11402 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11403 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11404 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11405 BPF_MOV64_IMM(BPF_REG_0, 0), 11406 BPF_EXIT_INSN(), 11407 }, 11408 .result = ACCEPT, 11409 .prog_type = BPF_PROG_TYPE_XDP, 11410 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11411 }, 11412 { 11413 "XDP pkt read, pkt_data <= pkt_meta', bad access 1", 11414 .insns = { 11415 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11416 offsetof(struct xdp_md, data_meta)), 11417 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11418 offsetof(struct xdp_md, data)), 11419 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11420 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11421 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 11422 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 11423 BPF_MOV64_IMM(BPF_REG_0, 0), 11424 BPF_EXIT_INSN(), 11425 }, 11426 .errstr = "R1 offset is outside of the packet", 11427 .result = REJECT, 11428 .prog_type = BPF_PROG_TYPE_XDP, 11429 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11430 }, 11431 { 11432 "XDP pkt read, pkt_data <= pkt_meta', bad access 2", 11433 .insns = { 11434 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11435 offsetof(struct xdp_md, data_meta)), 11436 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11437 offsetof(struct xdp_md, data)), 11438 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11439 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11440 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 11441 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 11442 BPF_MOV64_IMM(BPF_REG_0, 0), 11443 BPF_EXIT_INSN(), 11444 }, 11445 .errstr = "R1 offset is outside of the packet", 11446 .result = REJECT, 11447 .prog_type = BPF_PROG_TYPE_XDP, 11448 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11449 }, 11450 { 11451 "check deducing bounds from const, 1", 11452 .insns = { 11453 BPF_MOV64_IMM(BPF_REG_0, 1), 11454 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0), 11455 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11456 BPF_EXIT_INSN(), 11457 }, 11458 .result = REJECT, 11459 .errstr = "R0 tried to subtract pointer from scalar", 11460 }, 11461 { 11462 "check deducing bounds from const, 2", 11463 .insns = { 11464 BPF_MOV64_IMM(BPF_REG_0, 1), 11465 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 11466 BPF_EXIT_INSN(), 11467 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1), 11468 BPF_EXIT_INSN(), 11469 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11470 BPF_EXIT_INSN(), 11471 }, 11472 .result = ACCEPT, 11473 .retval = 1, 11474 }, 11475 { 11476 "check deducing bounds from const, 3", 11477 .insns = { 11478 BPF_MOV64_IMM(BPF_REG_0, 0), 11479 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 11480 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11481 BPF_EXIT_INSN(), 11482 }, 11483 .result = REJECT, 11484 .errstr = "R0 tried to subtract pointer from scalar", 11485 }, 11486 { 11487 "check deducing bounds from const, 4", 11488 .insns = { 11489 BPF_MOV64_IMM(BPF_REG_0, 0), 11490 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1), 11491 BPF_EXIT_INSN(), 11492 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11493 BPF_EXIT_INSN(), 11494 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11495 BPF_EXIT_INSN(), 11496 }, 11497 .result = ACCEPT, 11498 }, 11499 { 11500 "check deducing bounds from const, 5", 11501 .insns = { 11502 BPF_MOV64_IMM(BPF_REG_0, 0), 11503 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 11504 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11505 BPF_EXIT_INSN(), 11506 }, 11507 .result = REJECT, 11508 .errstr = "R0 tried to subtract pointer from scalar", 11509 }, 11510 { 11511 "check deducing bounds from const, 6", 11512 .insns = { 11513 BPF_MOV64_IMM(BPF_REG_0, 0), 11514 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11515 BPF_EXIT_INSN(), 11516 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11517 BPF_EXIT_INSN(), 11518 }, 11519 .result = REJECT, 11520 .errstr = "R0 tried to subtract pointer from scalar", 11521 }, 11522 { 11523 "check deducing bounds from const, 7", 11524 .insns = { 11525 BPF_MOV64_IMM(BPF_REG_0, ~0), 11526 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 11527 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 11528 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11529 offsetof(struct __sk_buff, mark)), 11530 BPF_EXIT_INSN(), 11531 }, 11532 .result = REJECT, 11533 .errstr = "dereference of modified ctx ptr", 11534 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11535 }, 11536 { 11537 "check deducing bounds from const, 8", 11538 .insns = { 11539 BPF_MOV64_IMM(BPF_REG_0, ~0), 11540 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 11541 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 11542 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11543 offsetof(struct __sk_buff, mark)), 11544 BPF_EXIT_INSN(), 11545 }, 11546 .result = REJECT, 11547 .errstr = "dereference of modified ctx ptr", 11548 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 11549 }, 11550 { 11551 "check deducing bounds from const, 9", 11552 .insns = { 11553 BPF_MOV64_IMM(BPF_REG_0, 0), 11554 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 11555 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11556 BPF_EXIT_INSN(), 11557 }, 11558 .result = REJECT, 11559 .errstr = "R0 tried to subtract pointer from scalar", 11560 }, 11561 { 11562 "check deducing bounds from const, 10", 11563 .insns = { 11564 BPF_MOV64_IMM(BPF_REG_0, 0), 11565 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 11566 /* Marks reg as unknown. */ 11567 BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0), 11568 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 11569 BPF_EXIT_INSN(), 11570 }, 11571 .result = REJECT, 11572 .errstr = "math between ctx pointer and register with unbounded min value is not allowed", 11573 }, 11574 { 11575 "bpf_exit with invalid return code. test1", 11576 .insns = { 11577 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11578 BPF_EXIT_INSN(), 11579 }, 11580 .errstr = "R0 has value (0x0; 0xffffffff)", 11581 .result = REJECT, 11582 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11583 }, 11584 { 11585 "bpf_exit with invalid return code. test2", 11586 .insns = { 11587 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11588 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 11589 BPF_EXIT_INSN(), 11590 }, 11591 .result = ACCEPT, 11592 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11593 }, 11594 { 11595 "bpf_exit with invalid return code. test3", 11596 .insns = { 11597 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11598 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 3), 11599 BPF_EXIT_INSN(), 11600 }, 11601 .errstr = "R0 has value (0x0; 0x3)", 11602 .result = REJECT, 11603 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11604 }, 11605 { 11606 "bpf_exit with invalid return code. test4", 11607 .insns = { 11608 BPF_MOV64_IMM(BPF_REG_0, 1), 11609 BPF_EXIT_INSN(), 11610 }, 11611 .result = ACCEPT, 11612 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11613 }, 11614 { 11615 "bpf_exit with invalid return code. test5", 11616 .insns = { 11617 BPF_MOV64_IMM(BPF_REG_0, 2), 11618 BPF_EXIT_INSN(), 11619 }, 11620 .errstr = "R0 has value (0x2; 0x0)", 11621 .result = REJECT, 11622 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11623 }, 11624 { 11625 "bpf_exit with invalid return code. test6", 11626 .insns = { 11627 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11628 BPF_EXIT_INSN(), 11629 }, 11630 .errstr = "R0 is not a known value (ctx)", 11631 .result = REJECT, 11632 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11633 }, 11634 { 11635 "bpf_exit with invalid return code. test7", 11636 .insns = { 11637 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 11638 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4), 11639 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_2), 11640 BPF_EXIT_INSN(), 11641 }, 11642 .errstr = "R0 has unknown scalar value", 11643 .result = REJECT, 11644 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 11645 }, 11646 { 11647 "calls: basic sanity", 11648 .insns = { 11649 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11650 BPF_MOV64_IMM(BPF_REG_0, 1), 11651 BPF_EXIT_INSN(), 11652 BPF_MOV64_IMM(BPF_REG_0, 2), 11653 BPF_EXIT_INSN(), 11654 }, 11655 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11656 .result = ACCEPT, 11657 }, 11658 { 11659 "calls: not on unpriviledged", 11660 .insns = { 11661 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11662 BPF_MOV64_IMM(BPF_REG_0, 1), 11663 BPF_EXIT_INSN(), 11664 BPF_MOV64_IMM(BPF_REG_0, 2), 11665 BPF_EXIT_INSN(), 11666 }, 11667 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 11668 .result_unpriv = REJECT, 11669 .result = ACCEPT, 11670 .retval = 1, 11671 }, 11672 { 11673 "calls: div by 0 in subprog", 11674 .insns = { 11675 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11676 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11677 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11678 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11679 offsetof(struct __sk_buff, data_end)), 11680 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11681 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11682 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11683 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11684 BPF_MOV64_IMM(BPF_REG_0, 1), 11685 BPF_EXIT_INSN(), 11686 BPF_MOV32_IMM(BPF_REG_2, 0), 11687 BPF_MOV32_IMM(BPF_REG_3, 1), 11688 BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2), 11689 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11690 offsetof(struct __sk_buff, data)), 11691 BPF_EXIT_INSN(), 11692 }, 11693 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11694 .result = ACCEPT, 11695 .retval = 1, 11696 }, 11697 { 11698 "calls: multiple ret types in subprog 1", 11699 .insns = { 11700 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11701 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11702 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11703 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11704 offsetof(struct __sk_buff, data_end)), 11705 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11706 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11707 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11708 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11709 BPF_MOV64_IMM(BPF_REG_0, 1), 11710 BPF_EXIT_INSN(), 11711 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11712 offsetof(struct __sk_buff, data)), 11713 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 11714 BPF_MOV32_IMM(BPF_REG_0, 42), 11715 BPF_EXIT_INSN(), 11716 }, 11717 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11718 .result = REJECT, 11719 .errstr = "R0 invalid mem access 'inv'", 11720 }, 11721 { 11722 "calls: multiple ret types in subprog 2", 11723 .insns = { 11724 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11725 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 11726 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11727 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 11728 offsetof(struct __sk_buff, data_end)), 11729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 11730 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 11731 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 11732 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 11733 BPF_MOV64_IMM(BPF_REG_0, 1), 11734 BPF_EXIT_INSN(), 11735 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11736 offsetof(struct __sk_buff, data)), 11737 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11738 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9), 11739 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11740 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11741 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11742 BPF_LD_MAP_FD(BPF_REG_1, 0), 11743 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11744 BPF_FUNC_map_lookup_elem), 11745 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 11746 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 11747 offsetof(struct __sk_buff, data)), 11748 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 11749 BPF_EXIT_INSN(), 11750 }, 11751 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11752 .fixup_map_hash_8b = { 16 }, 11753 .result = REJECT, 11754 .errstr = "R0 min value is outside of the array range", 11755 }, 11756 { 11757 "calls: overlapping caller/callee", 11758 .insns = { 11759 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0), 11760 BPF_MOV64_IMM(BPF_REG_0, 1), 11761 BPF_EXIT_INSN(), 11762 }, 11763 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11764 .errstr = "last insn is not an exit or jmp", 11765 .result = REJECT, 11766 }, 11767 { 11768 "calls: wrong recursive calls", 11769 .insns = { 11770 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11771 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11772 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11773 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11774 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 11775 BPF_MOV64_IMM(BPF_REG_0, 1), 11776 BPF_EXIT_INSN(), 11777 }, 11778 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11779 .errstr = "jump out of range", 11780 .result = REJECT, 11781 }, 11782 { 11783 "calls: wrong src reg", 11784 .insns = { 11785 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0), 11786 BPF_MOV64_IMM(BPF_REG_0, 1), 11787 BPF_EXIT_INSN(), 11788 }, 11789 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11790 .errstr = "BPF_CALL uses reserved fields", 11791 .result = REJECT, 11792 }, 11793 { 11794 "calls: wrong off value", 11795 .insns = { 11796 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2), 11797 BPF_MOV64_IMM(BPF_REG_0, 1), 11798 BPF_EXIT_INSN(), 11799 BPF_MOV64_IMM(BPF_REG_0, 2), 11800 BPF_EXIT_INSN(), 11801 }, 11802 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11803 .errstr = "BPF_CALL uses reserved fields", 11804 .result = REJECT, 11805 }, 11806 { 11807 "calls: jump back loop", 11808 .insns = { 11809 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 11810 BPF_MOV64_IMM(BPF_REG_0, 1), 11811 BPF_EXIT_INSN(), 11812 }, 11813 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11814 .errstr = "back-edge from insn 0 to 0", 11815 .result = REJECT, 11816 }, 11817 { 11818 "calls: conditional call", 11819 .insns = { 11820 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11821 offsetof(struct __sk_buff, mark)), 11822 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11823 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11824 BPF_MOV64_IMM(BPF_REG_0, 1), 11825 BPF_EXIT_INSN(), 11826 BPF_MOV64_IMM(BPF_REG_0, 2), 11827 BPF_EXIT_INSN(), 11828 }, 11829 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11830 .errstr = "jump out of range", 11831 .result = REJECT, 11832 }, 11833 { 11834 "calls: conditional call 2", 11835 .insns = { 11836 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11837 offsetof(struct __sk_buff, mark)), 11838 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11839 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11840 BPF_MOV64_IMM(BPF_REG_0, 1), 11841 BPF_EXIT_INSN(), 11842 BPF_MOV64_IMM(BPF_REG_0, 2), 11843 BPF_EXIT_INSN(), 11844 BPF_MOV64_IMM(BPF_REG_0, 3), 11845 BPF_EXIT_INSN(), 11846 }, 11847 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11848 .result = ACCEPT, 11849 }, 11850 { 11851 "calls: conditional call 3", 11852 .insns = { 11853 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11854 offsetof(struct __sk_buff, mark)), 11855 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11856 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 11857 BPF_MOV64_IMM(BPF_REG_0, 1), 11858 BPF_EXIT_INSN(), 11859 BPF_MOV64_IMM(BPF_REG_0, 1), 11860 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11861 BPF_MOV64_IMM(BPF_REG_0, 3), 11862 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11863 }, 11864 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11865 .errstr = "back-edge from insn", 11866 .result = REJECT, 11867 }, 11868 { 11869 "calls: conditional call 4", 11870 .insns = { 11871 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11872 offsetof(struct __sk_buff, mark)), 11873 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11874 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11875 BPF_MOV64_IMM(BPF_REG_0, 1), 11876 BPF_EXIT_INSN(), 11877 BPF_MOV64_IMM(BPF_REG_0, 1), 11878 BPF_JMP_IMM(BPF_JA, 0, 0, -5), 11879 BPF_MOV64_IMM(BPF_REG_0, 3), 11880 BPF_EXIT_INSN(), 11881 }, 11882 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11883 .result = ACCEPT, 11884 }, 11885 { 11886 "calls: conditional call 5", 11887 .insns = { 11888 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11889 offsetof(struct __sk_buff, mark)), 11890 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 11891 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11892 BPF_MOV64_IMM(BPF_REG_0, 1), 11893 BPF_EXIT_INSN(), 11894 BPF_MOV64_IMM(BPF_REG_0, 1), 11895 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 11896 BPF_MOV64_IMM(BPF_REG_0, 3), 11897 BPF_EXIT_INSN(), 11898 }, 11899 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11900 .errstr = "back-edge from insn", 11901 .result = REJECT, 11902 }, 11903 { 11904 "calls: conditional call 6", 11905 .insns = { 11906 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11907 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2), 11908 BPF_EXIT_INSN(), 11909 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11910 offsetof(struct __sk_buff, mark)), 11911 BPF_EXIT_INSN(), 11912 }, 11913 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11914 .errstr = "back-edge from insn", 11915 .result = REJECT, 11916 }, 11917 { 11918 "calls: using r0 returned by callee", 11919 .insns = { 11920 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11921 BPF_EXIT_INSN(), 11922 BPF_MOV64_IMM(BPF_REG_0, 2), 11923 BPF_EXIT_INSN(), 11924 }, 11925 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11926 .result = ACCEPT, 11927 }, 11928 { 11929 "calls: using uninit r0 from callee", 11930 .insns = { 11931 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11932 BPF_EXIT_INSN(), 11933 BPF_EXIT_INSN(), 11934 }, 11935 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11936 .errstr = "!read_ok", 11937 .result = REJECT, 11938 }, 11939 { 11940 "calls: callee is using r1", 11941 .insns = { 11942 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11943 BPF_EXIT_INSN(), 11944 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 11945 offsetof(struct __sk_buff, len)), 11946 BPF_EXIT_INSN(), 11947 }, 11948 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 11949 .result = ACCEPT, 11950 .retval = TEST_DATA_LEN, 11951 }, 11952 { 11953 "calls: callee using args1", 11954 .insns = { 11955 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11956 BPF_EXIT_INSN(), 11957 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11958 BPF_EXIT_INSN(), 11959 }, 11960 .errstr_unpriv = "allowed for root only", 11961 .result_unpriv = REJECT, 11962 .result = ACCEPT, 11963 .retval = POINTER_VALUE, 11964 }, 11965 { 11966 "calls: callee using wrong args2", 11967 .insns = { 11968 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11969 BPF_EXIT_INSN(), 11970 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11971 BPF_EXIT_INSN(), 11972 }, 11973 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11974 .errstr = "R2 !read_ok", 11975 .result = REJECT, 11976 }, 11977 { 11978 "calls: callee using two args", 11979 .insns = { 11980 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11981 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 11982 offsetof(struct __sk_buff, len)), 11983 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6, 11984 offsetof(struct __sk_buff, len)), 11985 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11986 BPF_EXIT_INSN(), 11987 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 11988 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 11989 BPF_EXIT_INSN(), 11990 }, 11991 .errstr_unpriv = "allowed for root only", 11992 .result_unpriv = REJECT, 11993 .result = ACCEPT, 11994 .retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN, 11995 }, 11996 { 11997 "calls: callee changing pkt pointers", 11998 .insns = { 11999 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 12000 offsetof(struct xdp_md, data)), 12001 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 12002 offsetof(struct xdp_md, data_end)), 12003 BPF_MOV64_REG(BPF_REG_8, BPF_REG_6), 12004 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8), 12005 BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2), 12006 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12007 /* clear_all_pkt_pointers() has to walk all frames 12008 * to make sure that pkt pointers in the caller 12009 * are cleared when callee is calling a helper that 12010 * adjusts packet size 12011 */ 12012 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12013 BPF_MOV32_IMM(BPF_REG_0, 0), 12014 BPF_EXIT_INSN(), 12015 BPF_MOV64_IMM(BPF_REG_2, 0), 12016 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12017 BPF_FUNC_xdp_adjust_head), 12018 BPF_EXIT_INSN(), 12019 }, 12020 .result = REJECT, 12021 .errstr = "R6 invalid mem access 'inv'", 12022 .prog_type = BPF_PROG_TYPE_XDP, 12023 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12024 }, 12025 { 12026 "calls: two calls with args", 12027 .insns = { 12028 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12029 BPF_EXIT_INSN(), 12030 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12031 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12032 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12033 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12034 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12035 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12036 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12037 BPF_EXIT_INSN(), 12038 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12039 offsetof(struct __sk_buff, len)), 12040 BPF_EXIT_INSN(), 12041 }, 12042 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12043 .result = ACCEPT, 12044 .retval = TEST_DATA_LEN + TEST_DATA_LEN, 12045 }, 12046 { 12047 "calls: calls with stack arith", 12048 .insns = { 12049 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12050 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12051 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12052 BPF_EXIT_INSN(), 12053 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12054 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12055 BPF_EXIT_INSN(), 12056 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 12057 BPF_MOV64_IMM(BPF_REG_0, 42), 12058 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 12059 BPF_EXIT_INSN(), 12060 }, 12061 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12062 .result = ACCEPT, 12063 .retval = 42, 12064 }, 12065 { 12066 "calls: calls with misaligned stack access", 12067 .insns = { 12068 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12069 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 12070 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12071 BPF_EXIT_INSN(), 12072 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61), 12073 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12074 BPF_EXIT_INSN(), 12075 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 12076 BPF_MOV64_IMM(BPF_REG_0, 42), 12077 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 12078 BPF_EXIT_INSN(), 12079 }, 12080 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12081 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 12082 .errstr = "misaligned stack access", 12083 .result = REJECT, 12084 }, 12085 { 12086 "calls: calls control flow, jump test", 12087 .insns = { 12088 BPF_MOV64_IMM(BPF_REG_0, 42), 12089 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12090 BPF_MOV64_IMM(BPF_REG_0, 43), 12091 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12092 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 12093 BPF_EXIT_INSN(), 12094 }, 12095 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12096 .result = ACCEPT, 12097 .retval = 43, 12098 }, 12099 { 12100 "calls: calls control flow, jump test 2", 12101 .insns = { 12102 BPF_MOV64_IMM(BPF_REG_0, 42), 12103 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12104 BPF_MOV64_IMM(BPF_REG_0, 43), 12105 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 12106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 12107 BPF_EXIT_INSN(), 12108 }, 12109 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12110 .errstr = "jump out of range from insn 1 to 4", 12111 .result = REJECT, 12112 }, 12113 { 12114 "calls: two calls with bad jump", 12115 .insns = { 12116 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12117 BPF_EXIT_INSN(), 12118 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12119 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12120 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12121 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12122 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12123 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12124 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12125 BPF_EXIT_INSN(), 12126 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12127 offsetof(struct __sk_buff, len)), 12128 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 12129 BPF_EXIT_INSN(), 12130 }, 12131 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12132 .errstr = "jump out of range from insn 11 to 9", 12133 .result = REJECT, 12134 }, 12135 { 12136 "calls: recursive call. test1", 12137 .insns = { 12138 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12139 BPF_EXIT_INSN(), 12140 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 12141 BPF_EXIT_INSN(), 12142 }, 12143 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12144 .errstr = "back-edge", 12145 .result = REJECT, 12146 }, 12147 { 12148 "calls: recursive call. test2", 12149 .insns = { 12150 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12151 BPF_EXIT_INSN(), 12152 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 12153 BPF_EXIT_INSN(), 12154 }, 12155 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12156 .errstr = "back-edge", 12157 .result = REJECT, 12158 }, 12159 { 12160 "calls: unreachable code", 12161 .insns = { 12162 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12163 BPF_EXIT_INSN(), 12164 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12165 BPF_EXIT_INSN(), 12166 BPF_MOV64_IMM(BPF_REG_0, 0), 12167 BPF_EXIT_INSN(), 12168 BPF_MOV64_IMM(BPF_REG_0, 0), 12169 BPF_EXIT_INSN(), 12170 }, 12171 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12172 .errstr = "unreachable insn 6", 12173 .result = REJECT, 12174 }, 12175 { 12176 "calls: invalid call", 12177 .insns = { 12178 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12179 BPF_EXIT_INSN(), 12180 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4), 12181 BPF_EXIT_INSN(), 12182 }, 12183 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12184 .errstr = "invalid destination", 12185 .result = REJECT, 12186 }, 12187 { 12188 "calls: invalid call 2", 12189 .insns = { 12190 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12191 BPF_EXIT_INSN(), 12192 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff), 12193 BPF_EXIT_INSN(), 12194 }, 12195 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12196 .errstr = "invalid destination", 12197 .result = REJECT, 12198 }, 12199 { 12200 "calls: jumping across function bodies. test1", 12201 .insns = { 12202 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12203 BPF_MOV64_IMM(BPF_REG_0, 0), 12204 BPF_EXIT_INSN(), 12205 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 12206 BPF_EXIT_INSN(), 12207 }, 12208 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12209 .errstr = "jump out of range", 12210 .result = REJECT, 12211 }, 12212 { 12213 "calls: jumping across function bodies. test2", 12214 .insns = { 12215 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 12216 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12217 BPF_MOV64_IMM(BPF_REG_0, 0), 12218 BPF_EXIT_INSN(), 12219 BPF_EXIT_INSN(), 12220 }, 12221 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12222 .errstr = "jump out of range", 12223 .result = REJECT, 12224 }, 12225 { 12226 "calls: call without exit", 12227 .insns = { 12228 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12229 BPF_EXIT_INSN(), 12230 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12231 BPF_EXIT_INSN(), 12232 BPF_MOV64_IMM(BPF_REG_0, 0), 12233 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2), 12234 }, 12235 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12236 .errstr = "not an exit", 12237 .result = REJECT, 12238 }, 12239 { 12240 "calls: call into middle of ld_imm64", 12241 .insns = { 12242 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12243 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12244 BPF_MOV64_IMM(BPF_REG_0, 0), 12245 BPF_EXIT_INSN(), 12246 BPF_LD_IMM64(BPF_REG_0, 0), 12247 BPF_EXIT_INSN(), 12248 }, 12249 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12250 .errstr = "last insn", 12251 .result = REJECT, 12252 }, 12253 { 12254 "calls: call into middle of other call", 12255 .insns = { 12256 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12257 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12258 BPF_MOV64_IMM(BPF_REG_0, 0), 12259 BPF_EXIT_INSN(), 12260 BPF_MOV64_IMM(BPF_REG_0, 0), 12261 BPF_MOV64_IMM(BPF_REG_0, 0), 12262 BPF_EXIT_INSN(), 12263 }, 12264 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12265 .errstr = "last insn", 12266 .result = REJECT, 12267 }, 12268 { 12269 "calls: ld_abs with changing ctx data in callee", 12270 .insns = { 12271 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12272 BPF_LD_ABS(BPF_B, 0), 12273 BPF_LD_ABS(BPF_H, 0), 12274 BPF_LD_ABS(BPF_W, 0), 12275 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 12276 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 12277 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 12278 BPF_LD_ABS(BPF_B, 0), 12279 BPF_LD_ABS(BPF_H, 0), 12280 BPF_LD_ABS(BPF_W, 0), 12281 BPF_EXIT_INSN(), 12282 BPF_MOV64_IMM(BPF_REG_2, 1), 12283 BPF_MOV64_IMM(BPF_REG_3, 2), 12284 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12285 BPF_FUNC_skb_vlan_push), 12286 BPF_EXIT_INSN(), 12287 }, 12288 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12289 .errstr = "BPF_LD_[ABS|IND] instructions cannot be mixed", 12290 .result = REJECT, 12291 }, 12292 { 12293 "calls: two calls with bad fallthrough", 12294 .insns = { 12295 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12296 BPF_EXIT_INSN(), 12297 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12298 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12299 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12300 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12301 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12302 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12303 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12304 BPF_MOV64_REG(BPF_REG_0, BPF_REG_0), 12305 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 12306 offsetof(struct __sk_buff, len)), 12307 BPF_EXIT_INSN(), 12308 }, 12309 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 12310 .errstr = "not an exit", 12311 .result = REJECT, 12312 }, 12313 { 12314 "calls: two calls with stack read", 12315 .insns = { 12316 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12317 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12318 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12319 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12320 BPF_EXIT_INSN(), 12321 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12322 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 12323 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 12324 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12325 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12326 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 12327 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 12328 BPF_EXIT_INSN(), 12329 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 12330 BPF_EXIT_INSN(), 12331 }, 12332 .prog_type = BPF_PROG_TYPE_XDP, 12333 .result = ACCEPT, 12334 }, 12335 { 12336 "calls: two calls with stack write", 12337 .insns = { 12338 /* main prog */ 12339 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12340 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12341 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12342 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12343 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12344 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12345 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12346 BPF_EXIT_INSN(), 12347 12348 /* subprog 1 */ 12349 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12350 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12351 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7), 12352 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 12353 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12354 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12355 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 12356 BPF_MOV64_REG(BPF_REG_0, BPF_REG_8), 12357 /* write into stack frame of main prog */ 12358 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12359 BPF_EXIT_INSN(), 12360 12361 /* subprog 2 */ 12362 /* read from stack frame of main prog */ 12363 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 12364 BPF_EXIT_INSN(), 12365 }, 12366 .prog_type = BPF_PROG_TYPE_XDP, 12367 .result = ACCEPT, 12368 }, 12369 { 12370 "calls: stack overflow using two frames (pre-call access)", 12371 .insns = { 12372 /* prog 1 */ 12373 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12374 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), 12375 BPF_EXIT_INSN(), 12376 12377 /* prog 2 */ 12378 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12379 BPF_MOV64_IMM(BPF_REG_0, 0), 12380 BPF_EXIT_INSN(), 12381 }, 12382 .prog_type = BPF_PROG_TYPE_XDP, 12383 .errstr = "combined stack size", 12384 .result = REJECT, 12385 }, 12386 { 12387 "calls: stack overflow using two frames (post-call access)", 12388 .insns = { 12389 /* prog 1 */ 12390 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), 12391 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12392 BPF_EXIT_INSN(), 12393 12394 /* prog 2 */ 12395 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12396 BPF_MOV64_IMM(BPF_REG_0, 0), 12397 BPF_EXIT_INSN(), 12398 }, 12399 .prog_type = BPF_PROG_TYPE_XDP, 12400 .errstr = "combined stack size", 12401 .result = REJECT, 12402 }, 12403 { 12404 "calls: stack depth check using three frames. test1", 12405 .insns = { 12406 /* main */ 12407 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12408 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 12409 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 12410 BPF_MOV64_IMM(BPF_REG_0, 0), 12411 BPF_EXIT_INSN(), 12412 /* A */ 12413 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12414 BPF_EXIT_INSN(), 12415 /* B */ 12416 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 12417 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12418 BPF_EXIT_INSN(), 12419 }, 12420 .prog_type = BPF_PROG_TYPE_XDP, 12421 /* stack_main=32, stack_A=256, stack_B=64 12422 * and max(main+A, main+A+B) < 512 12423 */ 12424 .result = ACCEPT, 12425 }, 12426 { 12427 "calls: stack depth check using three frames. test2", 12428 .insns = { 12429 /* main */ 12430 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12431 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 12432 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 12433 BPF_MOV64_IMM(BPF_REG_0, 0), 12434 BPF_EXIT_INSN(), 12435 /* A */ 12436 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12437 BPF_EXIT_INSN(), 12438 /* B */ 12439 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 12440 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12441 BPF_EXIT_INSN(), 12442 }, 12443 .prog_type = BPF_PROG_TYPE_XDP, 12444 /* stack_main=32, stack_A=64, stack_B=256 12445 * and max(main+A, main+A+B) < 512 12446 */ 12447 .result = ACCEPT, 12448 }, 12449 { 12450 "calls: stack depth check using three frames. test3", 12451 .insns = { 12452 /* main */ 12453 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12454 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 12455 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12456 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */ 12457 BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1), 12458 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 12459 BPF_MOV64_IMM(BPF_REG_0, 0), 12460 BPF_EXIT_INSN(), 12461 /* A */ 12462 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1), 12463 BPF_EXIT_INSN(), 12464 BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0), 12465 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 12466 /* B */ 12467 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1), 12468 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */ 12469 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 12470 BPF_EXIT_INSN(), 12471 }, 12472 .prog_type = BPF_PROG_TYPE_XDP, 12473 /* stack_main=64, stack_A=224, stack_B=256 12474 * and max(main+A, main+A+B) > 512 12475 */ 12476 .errstr = "combined stack", 12477 .result = REJECT, 12478 }, 12479 { 12480 "calls: stack depth check using three frames. test4", 12481 /* void main(void) { 12482 * func1(0); 12483 * func1(1); 12484 * func2(1); 12485 * } 12486 * void func1(int alloc_or_recurse) { 12487 * if (alloc_or_recurse) { 12488 * frame_pointer[-300] = 1; 12489 * } else { 12490 * func2(alloc_or_recurse); 12491 * } 12492 * } 12493 * void func2(int alloc_or_recurse) { 12494 * if (alloc_or_recurse) { 12495 * frame_pointer[-300] = 1; 12496 * } 12497 * } 12498 */ 12499 .insns = { 12500 /* main */ 12501 BPF_MOV64_IMM(BPF_REG_1, 0), 12502 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 12503 BPF_MOV64_IMM(BPF_REG_1, 1), 12504 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 12505 BPF_MOV64_IMM(BPF_REG_1, 1), 12506 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */ 12507 BPF_MOV64_IMM(BPF_REG_0, 0), 12508 BPF_EXIT_INSN(), 12509 /* A */ 12510 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 12511 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12512 BPF_EXIT_INSN(), 12513 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 12514 BPF_EXIT_INSN(), 12515 /* B */ 12516 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 12517 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 12518 BPF_EXIT_INSN(), 12519 }, 12520 .prog_type = BPF_PROG_TYPE_XDP, 12521 .result = REJECT, 12522 .errstr = "combined stack", 12523 }, 12524 { 12525 "calls: stack depth check using three frames. test5", 12526 .insns = { 12527 /* main */ 12528 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 12529 BPF_EXIT_INSN(), 12530 /* A */ 12531 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 12532 BPF_EXIT_INSN(), 12533 /* B */ 12534 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 12535 BPF_EXIT_INSN(), 12536 /* C */ 12537 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 12538 BPF_EXIT_INSN(), 12539 /* D */ 12540 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 12541 BPF_EXIT_INSN(), 12542 /* E */ 12543 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 12544 BPF_EXIT_INSN(), 12545 /* F */ 12546 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 12547 BPF_EXIT_INSN(), 12548 /* G */ 12549 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 12550 BPF_EXIT_INSN(), 12551 /* H */ 12552 BPF_MOV64_IMM(BPF_REG_0, 0), 12553 BPF_EXIT_INSN(), 12554 }, 12555 .prog_type = BPF_PROG_TYPE_XDP, 12556 .errstr = "call stack", 12557 .result = REJECT, 12558 }, 12559 { 12560 "calls: spill into caller stack frame", 12561 .insns = { 12562 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12563 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12564 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12565 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12566 BPF_EXIT_INSN(), 12567 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 12568 BPF_MOV64_IMM(BPF_REG_0, 0), 12569 BPF_EXIT_INSN(), 12570 }, 12571 .prog_type = BPF_PROG_TYPE_XDP, 12572 .errstr = "cannot spill", 12573 .result = REJECT, 12574 }, 12575 { 12576 "calls: write into caller stack frame", 12577 .insns = { 12578 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12579 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12580 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12581 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12582 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12583 BPF_EXIT_INSN(), 12584 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), 12585 BPF_MOV64_IMM(BPF_REG_0, 0), 12586 BPF_EXIT_INSN(), 12587 }, 12588 .prog_type = BPF_PROG_TYPE_XDP, 12589 .result = ACCEPT, 12590 .retval = 42, 12591 }, 12592 { 12593 "calls: write into callee stack frame", 12594 .insns = { 12595 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12596 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 12597 BPF_EXIT_INSN(), 12598 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 12599 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8), 12600 BPF_EXIT_INSN(), 12601 }, 12602 .prog_type = BPF_PROG_TYPE_XDP, 12603 .errstr = "cannot return stack pointer", 12604 .result = REJECT, 12605 }, 12606 { 12607 "calls: two calls with stack write and void return", 12608 .insns = { 12609 /* main prog */ 12610 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12611 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12612 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12613 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12614 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12615 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12616 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12617 BPF_EXIT_INSN(), 12618 12619 /* subprog 1 */ 12620 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12621 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12622 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12623 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12624 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12625 BPF_EXIT_INSN(), 12626 12627 /* subprog 2 */ 12628 /* write into stack frame of main prog */ 12629 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0), 12630 BPF_EXIT_INSN(), /* void return */ 12631 }, 12632 .prog_type = BPF_PROG_TYPE_XDP, 12633 .result = ACCEPT, 12634 }, 12635 { 12636 "calls: ambiguous return value", 12637 .insns = { 12638 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12639 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 12640 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12641 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 12642 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12643 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 12644 BPF_EXIT_INSN(), 12645 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 12646 BPF_MOV64_IMM(BPF_REG_0, 0), 12647 BPF_EXIT_INSN(), 12648 }, 12649 .errstr_unpriv = "allowed for root only", 12650 .result_unpriv = REJECT, 12651 .errstr = "R0 !read_ok", 12652 .result = REJECT, 12653 }, 12654 { 12655 "calls: two calls that return map_value", 12656 .insns = { 12657 /* main prog */ 12658 /* pass fp-16, fp-8 into a function */ 12659 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12660 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12661 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12662 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12663 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 12664 12665 /* fetch map_value_ptr from the stack of this function */ 12666 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 12667 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 12668 /* write into map value */ 12669 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12670 /* fetch secound map_value_ptr from the stack */ 12671 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 12672 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 12673 /* write into map value */ 12674 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12675 BPF_MOV64_IMM(BPF_REG_0, 0), 12676 BPF_EXIT_INSN(), 12677 12678 /* subprog 1 */ 12679 /* call 3rd function twice */ 12680 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12681 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12682 /* first time with fp-8 */ 12683 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 12684 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12685 /* second time with fp-16 */ 12686 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 12687 BPF_EXIT_INSN(), 12688 12689 /* subprog 2 */ 12690 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12691 /* lookup from map */ 12692 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12693 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12694 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12695 BPF_LD_MAP_FD(BPF_REG_1, 0), 12696 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12697 BPF_FUNC_map_lookup_elem), 12698 /* write map_value_ptr into stack frame of main prog */ 12699 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12700 BPF_MOV64_IMM(BPF_REG_0, 0), 12701 BPF_EXIT_INSN(), /* return 0 */ 12702 }, 12703 .prog_type = BPF_PROG_TYPE_XDP, 12704 .fixup_map_hash_8b = { 23 }, 12705 .result = ACCEPT, 12706 }, 12707 { 12708 "calls: two calls that return map_value with bool condition", 12709 .insns = { 12710 /* main prog */ 12711 /* pass fp-16, fp-8 into a function */ 12712 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12713 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12714 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12715 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12716 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12717 BPF_MOV64_IMM(BPF_REG_0, 0), 12718 BPF_EXIT_INSN(), 12719 12720 /* subprog 1 */ 12721 /* call 3rd function twice */ 12722 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12723 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12724 /* first time with fp-8 */ 12725 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 12726 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12727 /* fetch map_value_ptr from the stack of this function */ 12728 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12729 /* write into map value */ 12730 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12731 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12732 /* second time with fp-16 */ 12733 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12734 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12735 /* fetch secound map_value_ptr from the stack */ 12736 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 12737 /* write into map value */ 12738 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12739 BPF_EXIT_INSN(), 12740 12741 /* subprog 2 */ 12742 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12743 /* lookup from map */ 12744 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12745 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12746 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12747 BPF_LD_MAP_FD(BPF_REG_1, 0), 12748 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12749 BPF_FUNC_map_lookup_elem), 12750 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12751 BPF_MOV64_IMM(BPF_REG_0, 0), 12752 BPF_EXIT_INSN(), /* return 0 */ 12753 /* write map_value_ptr into stack frame of main prog */ 12754 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12755 BPF_MOV64_IMM(BPF_REG_0, 1), 12756 BPF_EXIT_INSN(), /* return 1 */ 12757 }, 12758 .prog_type = BPF_PROG_TYPE_XDP, 12759 .fixup_map_hash_8b = { 23 }, 12760 .result = ACCEPT, 12761 }, 12762 { 12763 "calls: two calls that return map_value with incorrect bool check", 12764 .insns = { 12765 /* main prog */ 12766 /* pass fp-16, fp-8 into a function */ 12767 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12768 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12769 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12770 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12771 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12772 BPF_MOV64_IMM(BPF_REG_0, 0), 12773 BPF_EXIT_INSN(), 12774 12775 /* subprog 1 */ 12776 /* call 3rd function twice */ 12777 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12778 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12779 /* first time with fp-8 */ 12780 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 12781 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 12782 /* fetch map_value_ptr from the stack of this function */ 12783 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12784 /* write into map value */ 12785 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12786 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12787 /* second time with fp-16 */ 12788 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12789 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12790 /* fetch secound map_value_ptr from the stack */ 12791 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 12792 /* write into map value */ 12793 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12794 BPF_EXIT_INSN(), 12795 12796 /* subprog 2 */ 12797 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12798 /* lookup from map */ 12799 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12800 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12801 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12802 BPF_LD_MAP_FD(BPF_REG_1, 0), 12803 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12804 BPF_FUNC_map_lookup_elem), 12805 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12806 BPF_MOV64_IMM(BPF_REG_0, 0), 12807 BPF_EXIT_INSN(), /* return 0 */ 12808 /* write map_value_ptr into stack frame of main prog */ 12809 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12810 BPF_MOV64_IMM(BPF_REG_0, 1), 12811 BPF_EXIT_INSN(), /* return 1 */ 12812 }, 12813 .prog_type = BPF_PROG_TYPE_XDP, 12814 .fixup_map_hash_8b = { 23 }, 12815 .result = REJECT, 12816 .errstr = "invalid read from stack off -16+0 size 8", 12817 }, 12818 { 12819 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1", 12820 .insns = { 12821 /* main prog */ 12822 /* pass fp-16, fp-8 into a function */ 12823 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12824 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12825 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12827 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12828 BPF_MOV64_IMM(BPF_REG_0, 0), 12829 BPF_EXIT_INSN(), 12830 12831 /* subprog 1 */ 12832 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12833 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12834 /* 1st lookup from map */ 12835 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12836 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12837 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12838 BPF_LD_MAP_FD(BPF_REG_1, 0), 12839 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12840 BPF_FUNC_map_lookup_elem), 12841 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12842 BPF_MOV64_IMM(BPF_REG_8, 0), 12843 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12844 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12845 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12846 BPF_MOV64_IMM(BPF_REG_8, 1), 12847 12848 /* 2nd lookup from map */ 12849 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12850 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12851 BPF_LD_MAP_FD(BPF_REG_1, 0), 12852 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12853 BPF_FUNC_map_lookup_elem), 12854 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12855 BPF_MOV64_IMM(BPF_REG_9, 0), 12856 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12857 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12858 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12859 BPF_MOV64_IMM(BPF_REG_9, 1), 12860 12861 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12862 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12863 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12864 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12865 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12866 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12867 BPF_EXIT_INSN(), 12868 12869 /* subprog 2 */ 12870 /* if arg2 == 1 do *arg1 = 0 */ 12871 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12872 /* fetch map_value_ptr from the stack of this function */ 12873 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12874 /* write into map value */ 12875 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12876 12877 /* if arg4 == 1 do *arg3 = 0 */ 12878 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12879 /* fetch map_value_ptr from the stack of this function */ 12880 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12881 /* write into map value */ 12882 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 12883 BPF_EXIT_INSN(), 12884 }, 12885 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12886 .fixup_map_hash_8b = { 12, 22 }, 12887 .result = REJECT, 12888 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 12889 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 12890 }, 12891 { 12892 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2", 12893 .insns = { 12894 /* main prog */ 12895 /* pass fp-16, fp-8 into a function */ 12896 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12897 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12898 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12899 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12900 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12901 BPF_MOV64_IMM(BPF_REG_0, 0), 12902 BPF_EXIT_INSN(), 12903 12904 /* subprog 1 */ 12905 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12906 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12907 /* 1st lookup from map */ 12908 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12909 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12910 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12911 BPF_LD_MAP_FD(BPF_REG_1, 0), 12912 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12913 BPF_FUNC_map_lookup_elem), 12914 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12915 BPF_MOV64_IMM(BPF_REG_8, 0), 12916 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12917 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12918 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12919 BPF_MOV64_IMM(BPF_REG_8, 1), 12920 12921 /* 2nd lookup from map */ 12922 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12923 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12924 BPF_LD_MAP_FD(BPF_REG_1, 0), 12925 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12926 BPF_FUNC_map_lookup_elem), 12927 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12928 BPF_MOV64_IMM(BPF_REG_9, 0), 12929 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12930 /* write map_value_ptr into stack frame of main prog at fp-16 */ 12931 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12932 BPF_MOV64_IMM(BPF_REG_9, 1), 12933 12934 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12935 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12936 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12937 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12938 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12939 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12940 BPF_EXIT_INSN(), 12941 12942 /* subprog 2 */ 12943 /* if arg2 == 1 do *arg1 = 0 */ 12944 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12945 /* fetch map_value_ptr from the stack of this function */ 12946 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12947 /* write into map value */ 12948 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12949 12950 /* if arg4 == 1 do *arg3 = 0 */ 12951 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12952 /* fetch map_value_ptr from the stack of this function */ 12953 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12954 /* write into map value */ 12955 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12956 BPF_EXIT_INSN(), 12957 }, 12958 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 12959 .fixup_map_hash_8b = { 12, 22 }, 12960 .result = ACCEPT, 12961 }, 12962 { 12963 "calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3", 12964 .insns = { 12965 /* main prog */ 12966 /* pass fp-16, fp-8 into a function */ 12967 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12968 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12969 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12970 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12971 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 12972 BPF_MOV64_IMM(BPF_REG_0, 0), 12973 BPF_EXIT_INSN(), 12974 12975 /* subprog 1 */ 12976 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12977 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12978 /* 1st lookup from map */ 12979 BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0), 12980 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 12982 BPF_LD_MAP_FD(BPF_REG_1, 0), 12983 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12984 BPF_FUNC_map_lookup_elem), 12985 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12986 BPF_MOV64_IMM(BPF_REG_8, 0), 12987 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12988 /* write map_value_ptr into stack frame of main prog at fp-8 */ 12989 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12990 BPF_MOV64_IMM(BPF_REG_8, 1), 12991 12992 /* 2nd lookup from map */ 12993 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12994 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 12995 BPF_LD_MAP_FD(BPF_REG_1, 0), 12996 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12997 BPF_FUNC_map_lookup_elem), 12998 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12999 BPF_MOV64_IMM(BPF_REG_9, 0), // 26 13000 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13001 /* write map_value_ptr into stack frame of main prog at fp-16 */ 13002 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13003 BPF_MOV64_IMM(BPF_REG_9, 1), 13004 13005 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13006 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30 13007 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13008 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13009 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13010 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34 13011 BPF_JMP_IMM(BPF_JA, 0, 0, -30), 13012 13013 /* subprog 2 */ 13014 /* if arg2 == 1 do *arg1 = 0 */ 13015 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13016 /* fetch map_value_ptr from the stack of this function */ 13017 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13018 /* write into map value */ 13019 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13020 13021 /* if arg4 == 1 do *arg3 = 0 */ 13022 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13023 /* fetch map_value_ptr from the stack of this function */ 13024 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13025 /* write into map value */ 13026 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 13027 BPF_JMP_IMM(BPF_JA, 0, 0, -8), 13028 }, 13029 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13030 .fixup_map_hash_8b = { 12, 22 }, 13031 .result = REJECT, 13032 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 13033 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13034 }, 13035 { 13036 "calls: two calls that receive map_value_ptr_or_null via arg. test1", 13037 .insns = { 13038 /* main prog */ 13039 /* pass fp-16, fp-8 into a function */ 13040 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13041 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13042 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13043 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13044 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13045 BPF_MOV64_IMM(BPF_REG_0, 0), 13046 BPF_EXIT_INSN(), 13047 13048 /* subprog 1 */ 13049 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13050 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13051 /* 1st lookup from map */ 13052 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13053 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13054 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13055 BPF_LD_MAP_FD(BPF_REG_1, 0), 13056 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13057 BPF_FUNC_map_lookup_elem), 13058 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13059 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13060 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13061 BPF_MOV64_IMM(BPF_REG_8, 0), 13062 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13063 BPF_MOV64_IMM(BPF_REG_8, 1), 13064 13065 /* 2nd lookup from map */ 13066 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13067 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13068 BPF_LD_MAP_FD(BPF_REG_1, 0), 13069 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13070 BPF_FUNC_map_lookup_elem), 13071 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 13072 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13073 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13074 BPF_MOV64_IMM(BPF_REG_9, 0), 13075 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13076 BPF_MOV64_IMM(BPF_REG_9, 1), 13077 13078 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13079 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13080 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13081 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13082 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13083 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13084 BPF_EXIT_INSN(), 13085 13086 /* subprog 2 */ 13087 /* if arg2 == 1 do *arg1 = 0 */ 13088 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13089 /* fetch map_value_ptr from the stack of this function */ 13090 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13091 /* write into map value */ 13092 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13093 13094 /* if arg4 == 1 do *arg3 = 0 */ 13095 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13096 /* fetch map_value_ptr from the stack of this function */ 13097 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13098 /* write into map value */ 13099 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13100 BPF_EXIT_INSN(), 13101 }, 13102 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13103 .fixup_map_hash_8b = { 12, 22 }, 13104 .result = ACCEPT, 13105 }, 13106 { 13107 "calls: two calls that receive map_value_ptr_or_null via arg. test2", 13108 .insns = { 13109 /* main prog */ 13110 /* pass fp-16, fp-8 into a function */ 13111 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13112 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13113 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13114 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13115 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13116 BPF_MOV64_IMM(BPF_REG_0, 0), 13117 BPF_EXIT_INSN(), 13118 13119 /* subprog 1 */ 13120 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13121 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13122 /* 1st lookup from map */ 13123 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13124 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13125 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13126 BPF_LD_MAP_FD(BPF_REG_1, 0), 13127 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13128 BPF_FUNC_map_lookup_elem), 13129 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13130 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13131 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13132 BPF_MOV64_IMM(BPF_REG_8, 0), 13133 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13134 BPF_MOV64_IMM(BPF_REG_8, 1), 13135 13136 /* 2nd lookup from map */ 13137 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13138 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13139 BPF_LD_MAP_FD(BPF_REG_1, 0), 13140 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13141 BPF_FUNC_map_lookup_elem), 13142 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 13143 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13144 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13145 BPF_MOV64_IMM(BPF_REG_9, 0), 13146 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13147 BPF_MOV64_IMM(BPF_REG_9, 1), 13148 13149 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13150 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13151 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13152 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13153 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13154 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13155 BPF_EXIT_INSN(), 13156 13157 /* subprog 2 */ 13158 /* if arg2 == 1 do *arg1 = 0 */ 13159 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13160 /* fetch map_value_ptr from the stack of this function */ 13161 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13162 /* write into map value */ 13163 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13164 13165 /* if arg4 == 0 do *arg3 = 0 */ 13166 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2), 13167 /* fetch map_value_ptr from the stack of this function */ 13168 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13169 /* write into map value */ 13170 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13171 BPF_EXIT_INSN(), 13172 }, 13173 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13174 .fixup_map_hash_8b = { 12, 22 }, 13175 .result = REJECT, 13176 .errstr = "R0 invalid mem access 'inv'", 13177 }, 13178 { 13179 "calls: pkt_ptr spill into caller stack", 13180 .insns = { 13181 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13182 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13183 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 13184 BPF_EXIT_INSN(), 13185 13186 /* subprog 1 */ 13187 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13188 offsetof(struct __sk_buff, data)), 13189 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13190 offsetof(struct __sk_buff, data_end)), 13191 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13192 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13193 /* spill unchecked pkt_ptr into stack of caller */ 13194 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13195 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13196 /* now the pkt range is verified, read pkt_ptr from stack */ 13197 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13198 /* write 4 bytes into packet */ 13199 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13200 BPF_EXIT_INSN(), 13201 }, 13202 .result = ACCEPT, 13203 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13204 .retval = POINTER_VALUE, 13205 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13206 }, 13207 { 13208 "calls: pkt_ptr spill into caller stack 2", 13209 .insns = { 13210 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13212 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13213 /* Marking is still kept, but not in all cases safe. */ 13214 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13215 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13216 BPF_EXIT_INSN(), 13217 13218 /* subprog 1 */ 13219 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13220 offsetof(struct __sk_buff, data)), 13221 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13222 offsetof(struct __sk_buff, data_end)), 13223 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13224 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13225 /* spill unchecked pkt_ptr into stack of caller */ 13226 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13227 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13228 /* now the pkt range is verified, read pkt_ptr from stack */ 13229 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13230 /* write 4 bytes into packet */ 13231 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13232 BPF_EXIT_INSN(), 13233 }, 13234 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13235 .errstr = "invalid access to packet", 13236 .result = REJECT, 13237 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13238 }, 13239 { 13240 "calls: pkt_ptr spill into caller stack 3", 13241 .insns = { 13242 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13243 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13244 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13245 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13246 /* Marking is still kept and safe here. */ 13247 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13248 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13249 BPF_EXIT_INSN(), 13250 13251 /* subprog 1 */ 13252 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13253 offsetof(struct __sk_buff, data)), 13254 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13255 offsetof(struct __sk_buff, data_end)), 13256 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13257 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13258 /* spill unchecked pkt_ptr into stack of caller */ 13259 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13260 BPF_MOV64_IMM(BPF_REG_5, 0), 13261 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13262 BPF_MOV64_IMM(BPF_REG_5, 1), 13263 /* now the pkt range is verified, read pkt_ptr from stack */ 13264 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 13265 /* write 4 bytes into packet */ 13266 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13267 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13268 BPF_EXIT_INSN(), 13269 }, 13270 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13271 .result = ACCEPT, 13272 .retval = 1, 13273 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13274 }, 13275 { 13276 "calls: pkt_ptr spill into caller stack 4", 13277 .insns = { 13278 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13280 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13281 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13282 /* Check marking propagated. */ 13283 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13284 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 13285 BPF_EXIT_INSN(), 13286 13287 /* subprog 1 */ 13288 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13289 offsetof(struct __sk_buff, data)), 13290 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13291 offsetof(struct __sk_buff, data_end)), 13292 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13293 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13294 /* spill unchecked pkt_ptr into stack of caller */ 13295 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13296 BPF_MOV64_IMM(BPF_REG_5, 0), 13297 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13298 BPF_MOV64_IMM(BPF_REG_5, 1), 13299 /* don't read back pkt_ptr from stack here */ 13300 /* write 4 bytes into packet */ 13301 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13302 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13303 BPF_EXIT_INSN(), 13304 }, 13305 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13306 .result = ACCEPT, 13307 .retval = 1, 13308 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13309 }, 13310 { 13311 "calls: pkt_ptr spill into caller stack 5", 13312 .insns = { 13313 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13314 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13315 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0), 13316 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13317 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13318 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13319 BPF_EXIT_INSN(), 13320 13321 /* subprog 1 */ 13322 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13323 offsetof(struct __sk_buff, data)), 13324 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13325 offsetof(struct __sk_buff, data_end)), 13326 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13327 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13328 BPF_MOV64_IMM(BPF_REG_5, 0), 13329 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13330 /* spill checked pkt_ptr into stack of caller */ 13331 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13332 BPF_MOV64_IMM(BPF_REG_5, 1), 13333 /* don't read back pkt_ptr from stack here */ 13334 /* write 4 bytes into packet */ 13335 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13336 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13337 BPF_EXIT_INSN(), 13338 }, 13339 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13340 .errstr = "same insn cannot be used with different", 13341 .result = REJECT, 13342 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13343 }, 13344 { 13345 "calls: pkt_ptr spill into caller stack 6", 13346 .insns = { 13347 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13348 offsetof(struct __sk_buff, data_end)), 13349 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13350 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13351 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13352 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13353 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13354 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13355 BPF_EXIT_INSN(), 13356 13357 /* subprog 1 */ 13358 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13359 offsetof(struct __sk_buff, data)), 13360 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13361 offsetof(struct __sk_buff, data_end)), 13362 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13363 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13364 BPF_MOV64_IMM(BPF_REG_5, 0), 13365 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13366 /* spill checked pkt_ptr into stack of caller */ 13367 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13368 BPF_MOV64_IMM(BPF_REG_5, 1), 13369 /* don't read back pkt_ptr from stack here */ 13370 /* write 4 bytes into packet */ 13371 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13372 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13373 BPF_EXIT_INSN(), 13374 }, 13375 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13376 .errstr = "R4 invalid mem access", 13377 .result = REJECT, 13378 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13379 }, 13380 { 13381 "calls: pkt_ptr spill into caller stack 7", 13382 .insns = { 13383 BPF_MOV64_IMM(BPF_REG_2, 0), 13384 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13385 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13386 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13387 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13388 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13389 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13390 BPF_EXIT_INSN(), 13391 13392 /* subprog 1 */ 13393 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13394 offsetof(struct __sk_buff, data)), 13395 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13396 offsetof(struct __sk_buff, data_end)), 13397 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13398 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13399 BPF_MOV64_IMM(BPF_REG_5, 0), 13400 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13401 /* spill checked pkt_ptr into stack of caller */ 13402 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13403 BPF_MOV64_IMM(BPF_REG_5, 1), 13404 /* don't read back pkt_ptr from stack here */ 13405 /* write 4 bytes into packet */ 13406 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13407 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13408 BPF_EXIT_INSN(), 13409 }, 13410 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13411 .errstr = "R4 invalid mem access", 13412 .result = REJECT, 13413 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13414 }, 13415 { 13416 "calls: pkt_ptr spill into caller stack 8", 13417 .insns = { 13418 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13419 offsetof(struct __sk_buff, data)), 13420 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13421 offsetof(struct __sk_buff, data_end)), 13422 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13423 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13424 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13425 BPF_EXIT_INSN(), 13426 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13427 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13428 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13429 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13430 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13431 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13432 BPF_EXIT_INSN(), 13433 13434 /* subprog 1 */ 13435 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13436 offsetof(struct __sk_buff, data)), 13437 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13438 offsetof(struct __sk_buff, data_end)), 13439 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13441 BPF_MOV64_IMM(BPF_REG_5, 0), 13442 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 13443 /* spill checked pkt_ptr into stack of caller */ 13444 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13445 BPF_MOV64_IMM(BPF_REG_5, 1), 13446 /* don't read back pkt_ptr from stack here */ 13447 /* write 4 bytes into packet */ 13448 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13449 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13450 BPF_EXIT_INSN(), 13451 }, 13452 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13453 .result = ACCEPT, 13454 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13455 }, 13456 { 13457 "calls: pkt_ptr spill into caller stack 9", 13458 .insns = { 13459 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13460 offsetof(struct __sk_buff, data)), 13461 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13462 offsetof(struct __sk_buff, data_end)), 13463 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13464 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13465 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 13466 BPF_EXIT_INSN(), 13467 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 13468 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 13469 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13470 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 13471 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 13472 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 13473 BPF_EXIT_INSN(), 13474 13475 /* subprog 1 */ 13476 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13477 offsetof(struct __sk_buff, data)), 13478 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13479 offsetof(struct __sk_buff, data_end)), 13480 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 13481 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 13482 BPF_MOV64_IMM(BPF_REG_5, 0), 13483 /* spill unchecked pkt_ptr into stack of caller */ 13484 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 13485 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 13486 BPF_MOV64_IMM(BPF_REG_5, 1), 13487 /* don't read back pkt_ptr from stack here */ 13488 /* write 4 bytes into packet */ 13489 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13490 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 13491 BPF_EXIT_INSN(), 13492 }, 13493 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13494 .errstr = "invalid access to packet", 13495 .result = REJECT, 13496 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13497 }, 13498 { 13499 "calls: caller stack init to zero or map_value_or_null", 13500 .insns = { 13501 BPF_MOV64_IMM(BPF_REG_0, 0), 13502 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13503 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13504 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13505 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 13506 /* fetch map_value_or_null or const_zero from stack */ 13507 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13508 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 13509 /* store into map_value */ 13510 BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0), 13511 BPF_EXIT_INSN(), 13512 13513 /* subprog 1 */ 13514 /* if (ctx == 0) return; */ 13515 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8), 13516 /* else bpf_map_lookup() and *(fp - 8) = r0 */ 13517 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 13518 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13519 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13520 BPF_LD_MAP_FD(BPF_REG_1, 0), 13521 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13522 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13523 BPF_FUNC_map_lookup_elem), 13524 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 13525 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13526 BPF_EXIT_INSN(), 13527 }, 13528 .fixup_map_hash_8b = { 13 }, 13529 .result = ACCEPT, 13530 .prog_type = BPF_PROG_TYPE_XDP, 13531 }, 13532 { 13533 "calls: stack init to zero and pruning", 13534 .insns = { 13535 /* first make allocated_stack 16 byte */ 13536 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 13537 /* now fork the execution such that the false branch 13538 * of JGT insn will be verified second and it skisp zero 13539 * init of fp-8 stack slot. If stack liveness marking 13540 * is missing live_read marks from call map_lookup 13541 * processing then pruning will incorrectly assume 13542 * that fp-8 stack slot was unused in the fall-through 13543 * branch and will accept the program incorrectly 13544 */ 13545 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2), 13546 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13547 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 13548 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13549 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13550 BPF_LD_MAP_FD(BPF_REG_1, 0), 13551 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13552 BPF_FUNC_map_lookup_elem), 13553 BPF_EXIT_INSN(), 13554 }, 13555 .fixup_map_hash_48b = { 6 }, 13556 .errstr = "invalid indirect read from stack off -8+0 size 8", 13557 .result = REJECT, 13558 .prog_type = BPF_PROG_TYPE_XDP, 13559 }, 13560 { 13561 "calls: two calls returning different map pointers for lookup (hash, array)", 13562 .insns = { 13563 /* main prog */ 13564 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13565 BPF_CALL_REL(11), 13566 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13567 BPF_CALL_REL(12), 13568 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13569 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13570 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13571 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13572 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13573 BPF_FUNC_map_lookup_elem), 13574 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13575 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 13576 offsetof(struct test_val, foo)), 13577 BPF_MOV64_IMM(BPF_REG_0, 1), 13578 BPF_EXIT_INSN(), 13579 /* subprog 1 */ 13580 BPF_LD_MAP_FD(BPF_REG_0, 0), 13581 BPF_EXIT_INSN(), 13582 /* subprog 2 */ 13583 BPF_LD_MAP_FD(BPF_REG_0, 0), 13584 BPF_EXIT_INSN(), 13585 }, 13586 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13587 .fixup_map_hash_48b = { 13 }, 13588 .fixup_map_array_48b = { 16 }, 13589 .result = ACCEPT, 13590 .retval = 1, 13591 }, 13592 { 13593 "calls: two calls returning different map pointers for lookup (hash, map in map)", 13594 .insns = { 13595 /* main prog */ 13596 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13597 BPF_CALL_REL(11), 13598 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 13599 BPF_CALL_REL(12), 13600 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 13601 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13602 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13603 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13604 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13605 BPF_FUNC_map_lookup_elem), 13606 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 13607 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 13608 offsetof(struct test_val, foo)), 13609 BPF_MOV64_IMM(BPF_REG_0, 1), 13610 BPF_EXIT_INSN(), 13611 /* subprog 1 */ 13612 BPF_LD_MAP_FD(BPF_REG_0, 0), 13613 BPF_EXIT_INSN(), 13614 /* subprog 2 */ 13615 BPF_LD_MAP_FD(BPF_REG_0, 0), 13616 BPF_EXIT_INSN(), 13617 }, 13618 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13619 .fixup_map_in_map = { 16 }, 13620 .fixup_map_array_48b = { 13 }, 13621 .result = REJECT, 13622 .errstr = "R0 invalid mem access 'map_ptr'", 13623 }, 13624 { 13625 "cond: two branches returning different map pointers for lookup (tail, tail)", 13626 .insns = { 13627 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 13628 offsetof(struct __sk_buff, mark)), 13629 BPF_JMP_IMM(BPF_JNE, BPF_REG_6, 0, 3), 13630 BPF_LD_MAP_FD(BPF_REG_2, 0), 13631 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13632 BPF_LD_MAP_FD(BPF_REG_2, 0), 13633 BPF_MOV64_IMM(BPF_REG_3, 7), 13634 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13635 BPF_FUNC_tail_call), 13636 BPF_MOV64_IMM(BPF_REG_0, 1), 13637 BPF_EXIT_INSN(), 13638 }, 13639 .fixup_prog1 = { 5 }, 13640 .fixup_prog2 = { 2 }, 13641 .result_unpriv = REJECT, 13642 .errstr_unpriv = "tail_call abusing map_ptr", 13643 .result = ACCEPT, 13644 .retval = 42, 13645 }, 13646 { 13647 "cond: two branches returning same map pointers for lookup (tail, tail)", 13648 .insns = { 13649 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 13650 offsetof(struct __sk_buff, mark)), 13651 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 3), 13652 BPF_LD_MAP_FD(BPF_REG_2, 0), 13653 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13654 BPF_LD_MAP_FD(BPF_REG_2, 0), 13655 BPF_MOV64_IMM(BPF_REG_3, 7), 13656 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13657 BPF_FUNC_tail_call), 13658 BPF_MOV64_IMM(BPF_REG_0, 1), 13659 BPF_EXIT_INSN(), 13660 }, 13661 .fixup_prog2 = { 2, 5 }, 13662 .result_unpriv = ACCEPT, 13663 .result = ACCEPT, 13664 .retval = 42, 13665 }, 13666 { 13667 "search pruning: all branches should be verified (nop operation)", 13668 .insns = { 13669 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13670 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13671 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 13672 BPF_LD_MAP_FD(BPF_REG_1, 0), 13673 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 13674 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 13675 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 13676 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 13677 BPF_MOV64_IMM(BPF_REG_4, 0), 13678 BPF_JMP_A(1), 13679 BPF_MOV64_IMM(BPF_REG_4, 1), 13680 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 13681 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 13682 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 13683 BPF_JMP_IMM(BPF_JEQ, BPF_REG_5, 0, 2), 13684 BPF_MOV64_IMM(BPF_REG_6, 0), 13685 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xdead), 13686 BPF_EXIT_INSN(), 13687 }, 13688 .fixup_map_hash_8b = { 3 }, 13689 .errstr = "R6 invalid mem access 'inv'", 13690 .result = REJECT, 13691 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13692 }, 13693 { 13694 "search pruning: all branches should be verified (invalid stack access)", 13695 .insns = { 13696 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13697 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13698 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 13699 BPF_LD_MAP_FD(BPF_REG_1, 0), 13700 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 13701 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 13702 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 13703 BPF_MOV64_IMM(BPF_REG_4, 0), 13704 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 13705 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 13706 BPF_JMP_A(1), 13707 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -24), 13708 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 13709 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 13710 BPF_EXIT_INSN(), 13711 }, 13712 .fixup_map_hash_8b = { 3 }, 13713 .errstr = "invalid read from stack off -16+0 size 8", 13714 .result = REJECT, 13715 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13716 }, 13717 { 13718 "jit: lsh, rsh, arsh by 1", 13719 .insns = { 13720 BPF_MOV64_IMM(BPF_REG_0, 1), 13721 BPF_MOV64_IMM(BPF_REG_1, 0xff), 13722 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1), 13723 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1), 13724 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1), 13725 BPF_EXIT_INSN(), 13726 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1), 13727 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1), 13728 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1), 13729 BPF_EXIT_INSN(), 13730 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1), 13731 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1), 13732 BPF_EXIT_INSN(), 13733 BPF_MOV64_IMM(BPF_REG_0, 2), 13734 BPF_EXIT_INSN(), 13735 }, 13736 .result = ACCEPT, 13737 .retval = 2, 13738 }, 13739 { 13740 "jit: mov32 for ldimm64, 1", 13741 .insns = { 13742 BPF_MOV64_IMM(BPF_REG_0, 2), 13743 BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL), 13744 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32), 13745 BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL), 13746 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 13747 BPF_MOV64_IMM(BPF_REG_0, 1), 13748 BPF_EXIT_INSN(), 13749 }, 13750 .result = ACCEPT, 13751 .retval = 2, 13752 }, 13753 { 13754 "jit: mov32 for ldimm64, 2", 13755 .insns = { 13756 BPF_MOV64_IMM(BPF_REG_0, 1), 13757 BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL), 13758 BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL), 13759 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 13760 BPF_MOV64_IMM(BPF_REG_0, 2), 13761 BPF_EXIT_INSN(), 13762 }, 13763 .result = ACCEPT, 13764 .retval = 2, 13765 }, 13766 { 13767 "jit: various mul tests", 13768 .insns = { 13769 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 13770 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 13771 BPF_LD_IMM64(BPF_REG_1, 0xefefefULL), 13772 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 13773 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 13774 BPF_MOV64_IMM(BPF_REG_0, 1), 13775 BPF_EXIT_INSN(), 13776 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 13777 BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 13778 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 13779 BPF_MOV64_IMM(BPF_REG_0, 1), 13780 BPF_EXIT_INSN(), 13781 BPF_MOV32_REG(BPF_REG_2, BPF_REG_2), 13782 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 13783 BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 13784 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 13785 BPF_MOV64_IMM(BPF_REG_0, 1), 13786 BPF_EXIT_INSN(), 13787 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 13788 BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 13789 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 13790 BPF_MOV64_IMM(BPF_REG_0, 1), 13791 BPF_EXIT_INSN(), 13792 BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL), 13793 BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL), 13794 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 13795 BPF_ALU32_REG(BPF_MUL, BPF_REG_2, BPF_REG_1), 13796 BPF_JMP_REG(BPF_JEQ, BPF_REG_2, BPF_REG_0, 2), 13797 BPF_MOV64_IMM(BPF_REG_0, 1), 13798 BPF_EXIT_INSN(), 13799 BPF_MOV64_IMM(BPF_REG_0, 2), 13800 BPF_EXIT_INSN(), 13801 }, 13802 .result = ACCEPT, 13803 .retval = 2, 13804 }, 13805 { 13806 "xadd/w check unaligned stack", 13807 .insns = { 13808 BPF_MOV64_IMM(BPF_REG_0, 1), 13809 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13810 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7), 13811 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13812 BPF_EXIT_INSN(), 13813 }, 13814 .result = REJECT, 13815 .errstr = "misaligned stack access off", 13816 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13817 }, 13818 { 13819 "xadd/w check unaligned map", 13820 .insns = { 13821 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13822 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13824 BPF_LD_MAP_FD(BPF_REG_1, 0), 13825 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13826 BPF_FUNC_map_lookup_elem), 13827 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 13828 BPF_EXIT_INSN(), 13829 BPF_MOV64_IMM(BPF_REG_1, 1), 13830 BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3), 13831 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3), 13832 BPF_EXIT_INSN(), 13833 }, 13834 .fixup_map_hash_8b = { 3 }, 13835 .result = REJECT, 13836 .errstr = "misaligned value access off", 13837 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13838 }, 13839 { 13840 "xadd/w check unaligned pkt", 13841 .insns = { 13842 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 13843 offsetof(struct xdp_md, data)), 13844 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 13845 offsetof(struct xdp_md, data_end)), 13846 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 13847 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 13848 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2), 13849 BPF_MOV64_IMM(BPF_REG_0, 99), 13850 BPF_JMP_IMM(BPF_JA, 0, 0, 6), 13851 BPF_MOV64_IMM(BPF_REG_0, 1), 13852 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 13853 BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0), 13854 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1), 13855 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2), 13856 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1), 13857 BPF_EXIT_INSN(), 13858 }, 13859 .result = REJECT, 13860 .errstr = "BPF_XADD stores into R2 pkt is not allowed", 13861 .prog_type = BPF_PROG_TYPE_XDP, 13862 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13863 }, 13864 { 13865 "xadd/w check whether src/dst got mangled, 1", 13866 .insns = { 13867 BPF_MOV64_IMM(BPF_REG_0, 1), 13868 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13869 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13870 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13871 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13872 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 13873 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 13874 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 13875 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 13876 BPF_EXIT_INSN(), 13877 BPF_MOV64_IMM(BPF_REG_0, 42), 13878 BPF_EXIT_INSN(), 13879 }, 13880 .result = ACCEPT, 13881 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13882 .retval = 3, 13883 }, 13884 { 13885 "xadd/w check whether src/dst got mangled, 2", 13886 .insns = { 13887 BPF_MOV64_IMM(BPF_REG_0, 1), 13888 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 13889 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 13890 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13891 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13892 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8), 13893 BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3), 13894 BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2), 13895 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 13896 BPF_EXIT_INSN(), 13897 BPF_MOV64_IMM(BPF_REG_0, 42), 13898 BPF_EXIT_INSN(), 13899 }, 13900 .result = ACCEPT, 13901 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13902 .retval = 3, 13903 }, 13904 { 13905 "bpf_get_stack return R0 within range", 13906 .insns = { 13907 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13908 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13909 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13910 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13911 BPF_LD_MAP_FD(BPF_REG_1, 0), 13912 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 13913 BPF_FUNC_map_lookup_elem), 13914 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28), 13915 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 13916 BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)), 13917 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13918 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 13919 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)), 13920 BPF_MOV64_IMM(BPF_REG_4, 256), 13921 BPF_EMIT_CALL(BPF_FUNC_get_stack), 13922 BPF_MOV64_IMM(BPF_REG_1, 0), 13923 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 13924 BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32), 13925 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32), 13926 BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16), 13927 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), 13928 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 13929 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8), 13930 BPF_MOV64_REG(BPF_REG_1, BPF_REG_9), 13931 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), 13932 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 32), 13933 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 13934 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1), 13935 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 13936 BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)), 13937 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5), 13938 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4), 13939 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 13940 BPF_MOV64_REG(BPF_REG_3, BPF_REG_9), 13941 BPF_MOV64_IMM(BPF_REG_4, 0), 13942 BPF_EMIT_CALL(BPF_FUNC_get_stack), 13943 BPF_EXIT_INSN(), 13944 }, 13945 .fixup_map_hash_48b = { 4 }, 13946 .result = ACCEPT, 13947 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 13948 }, 13949 { 13950 "ld_abs: invalid op 1", 13951 .insns = { 13952 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13953 BPF_LD_ABS(BPF_DW, 0), 13954 BPF_EXIT_INSN(), 13955 }, 13956 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13957 .result = REJECT, 13958 .errstr = "unknown opcode", 13959 }, 13960 { 13961 "ld_abs: invalid op 2", 13962 .insns = { 13963 BPF_MOV32_IMM(BPF_REG_0, 256), 13964 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13965 BPF_LD_IND(BPF_DW, BPF_REG_0, 0), 13966 BPF_EXIT_INSN(), 13967 }, 13968 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13969 .result = REJECT, 13970 .errstr = "unknown opcode", 13971 }, 13972 { 13973 "ld_abs: nmap reduced", 13974 .insns = { 13975 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13976 BPF_LD_ABS(BPF_H, 12), 13977 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28), 13978 BPF_LD_ABS(BPF_H, 12), 13979 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26), 13980 BPF_MOV32_IMM(BPF_REG_0, 18), 13981 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64), 13982 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64), 13983 BPF_LD_IND(BPF_W, BPF_REG_7, 14), 13984 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60), 13985 BPF_MOV32_IMM(BPF_REG_0, 280971478), 13986 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 13987 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 13988 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60), 13989 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 13990 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15), 13991 BPF_LD_ABS(BPF_H, 12), 13992 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13), 13993 BPF_MOV32_IMM(BPF_REG_0, 22), 13994 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 13995 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 13996 BPF_LD_IND(BPF_H, BPF_REG_7, 14), 13997 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52), 13998 BPF_MOV32_IMM(BPF_REG_0, 17366), 13999 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48), 14000 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48), 14001 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52), 14002 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 14003 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 14004 BPF_MOV32_IMM(BPF_REG_0, 256), 14005 BPF_EXIT_INSN(), 14006 BPF_MOV32_IMM(BPF_REG_0, 0), 14007 BPF_EXIT_INSN(), 14008 }, 14009 .data = { 14010 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 14011 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14012 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 14013 }, 14014 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14015 .result = ACCEPT, 14016 .retval = 256, 14017 }, 14018 { 14019 "ld_abs: div + abs, test 1", 14020 .insns = { 14021 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14022 BPF_LD_ABS(BPF_B, 3), 14023 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 14024 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 14025 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 14026 BPF_LD_ABS(BPF_B, 4), 14027 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 14028 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 14029 BPF_EXIT_INSN(), 14030 }, 14031 .data = { 14032 10, 20, 30, 40, 50, 14033 }, 14034 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14035 .result = ACCEPT, 14036 .retval = 10, 14037 }, 14038 { 14039 "ld_abs: div + abs, test 2", 14040 .insns = { 14041 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14042 BPF_LD_ABS(BPF_B, 3), 14043 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 14044 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 14045 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 14046 BPF_LD_ABS(BPF_B, 128), 14047 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 14048 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 14049 BPF_EXIT_INSN(), 14050 }, 14051 .data = { 14052 10, 20, 30, 40, 50, 14053 }, 14054 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14055 .result = ACCEPT, 14056 .retval = 0, 14057 }, 14058 { 14059 "ld_abs: div + abs, test 3", 14060 .insns = { 14061 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14062 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 14063 BPF_LD_ABS(BPF_B, 3), 14064 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 14065 BPF_EXIT_INSN(), 14066 }, 14067 .data = { 14068 10, 20, 30, 40, 50, 14069 }, 14070 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14071 .result = ACCEPT, 14072 .retval = 0, 14073 }, 14074 { 14075 "ld_abs: div + abs, test 4", 14076 .insns = { 14077 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14078 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 14079 BPF_LD_ABS(BPF_B, 256), 14080 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 14081 BPF_EXIT_INSN(), 14082 }, 14083 .data = { 14084 10, 20, 30, 40, 50, 14085 }, 14086 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14087 .result = ACCEPT, 14088 .retval = 0, 14089 }, 14090 { 14091 "ld_abs: vlan + abs, test 1", 14092 .insns = { }, 14093 .data = { 14094 0x34, 14095 }, 14096 .fill_helper = bpf_fill_ld_abs_vlan_push_pop, 14097 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14098 .result = ACCEPT, 14099 .retval = 0xbef, 14100 }, 14101 { 14102 "ld_abs: vlan + abs, test 2", 14103 .insns = { 14104 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14105 BPF_LD_ABS(BPF_B, 0), 14106 BPF_LD_ABS(BPF_H, 0), 14107 BPF_LD_ABS(BPF_W, 0), 14108 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 14109 BPF_MOV64_IMM(BPF_REG_6, 0), 14110 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 14111 BPF_MOV64_IMM(BPF_REG_2, 1), 14112 BPF_MOV64_IMM(BPF_REG_3, 2), 14113 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14114 BPF_FUNC_skb_vlan_push), 14115 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 14116 BPF_LD_ABS(BPF_B, 0), 14117 BPF_LD_ABS(BPF_H, 0), 14118 BPF_LD_ABS(BPF_W, 0), 14119 BPF_MOV64_IMM(BPF_REG_0, 42), 14120 BPF_EXIT_INSN(), 14121 }, 14122 .data = { 14123 0x34, 14124 }, 14125 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14126 .result = ACCEPT, 14127 .retval = 42, 14128 }, 14129 { 14130 "ld_abs: jump around ld_abs", 14131 .insns = { }, 14132 .data = { 14133 10, 11, 14134 }, 14135 .fill_helper = bpf_fill_jump_around_ld_abs, 14136 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14137 .result = ACCEPT, 14138 .retval = 10, 14139 }, 14140 { 14141 "ld_dw: xor semi-random 64 bit imms, test 1", 14142 .insns = { }, 14143 .data = { }, 14144 .fill_helper = bpf_fill_rand_ld_dw, 14145 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14146 .result = ACCEPT, 14147 .retval = 4090, 14148 }, 14149 { 14150 "ld_dw: xor semi-random 64 bit imms, test 2", 14151 .insns = { }, 14152 .data = { }, 14153 .fill_helper = bpf_fill_rand_ld_dw, 14154 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14155 .result = ACCEPT, 14156 .retval = 2047, 14157 }, 14158 { 14159 "ld_dw: xor semi-random 64 bit imms, test 3", 14160 .insns = { }, 14161 .data = { }, 14162 .fill_helper = bpf_fill_rand_ld_dw, 14163 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14164 .result = ACCEPT, 14165 .retval = 511, 14166 }, 14167 { 14168 "ld_dw: xor semi-random 64 bit imms, test 4", 14169 .insns = { }, 14170 .data = { }, 14171 .fill_helper = bpf_fill_rand_ld_dw, 14172 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14173 .result = ACCEPT, 14174 .retval = 5, 14175 }, 14176 { 14177 "pass unmodified ctx pointer to helper", 14178 .insns = { 14179 BPF_MOV64_IMM(BPF_REG_2, 0), 14180 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14181 BPF_FUNC_csum_update), 14182 BPF_MOV64_IMM(BPF_REG_0, 0), 14183 BPF_EXIT_INSN(), 14184 }, 14185 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14186 .result = ACCEPT, 14187 }, 14188 { 14189 "reference tracking: leak potential reference", 14190 .insns = { 14191 BPF_SK_LOOKUP, 14192 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), /* leak reference */ 14193 BPF_EXIT_INSN(), 14194 }, 14195 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14196 .errstr = "Unreleased reference", 14197 .result = REJECT, 14198 }, 14199 { 14200 "reference tracking: leak potential reference on stack", 14201 .insns = { 14202 BPF_SK_LOOKUP, 14203 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14204 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14205 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14206 BPF_MOV64_IMM(BPF_REG_0, 0), 14207 BPF_EXIT_INSN(), 14208 }, 14209 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14210 .errstr = "Unreleased reference", 14211 .result = REJECT, 14212 }, 14213 { 14214 "reference tracking: leak potential reference on stack 2", 14215 .insns = { 14216 BPF_SK_LOOKUP, 14217 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14218 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14219 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14220 BPF_MOV64_IMM(BPF_REG_0, 0), 14221 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 14222 BPF_EXIT_INSN(), 14223 }, 14224 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14225 .errstr = "Unreleased reference", 14226 .result = REJECT, 14227 }, 14228 { 14229 "reference tracking: zero potential reference", 14230 .insns = { 14231 BPF_SK_LOOKUP, 14232 BPF_MOV64_IMM(BPF_REG_0, 0), /* leak reference */ 14233 BPF_EXIT_INSN(), 14234 }, 14235 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14236 .errstr = "Unreleased reference", 14237 .result = REJECT, 14238 }, 14239 { 14240 "reference tracking: copy and zero potential references", 14241 .insns = { 14242 BPF_SK_LOOKUP, 14243 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 14244 BPF_MOV64_IMM(BPF_REG_0, 0), 14245 BPF_MOV64_IMM(BPF_REG_7, 0), /* leak reference */ 14246 BPF_EXIT_INSN(), 14247 }, 14248 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14249 .errstr = "Unreleased reference", 14250 .result = REJECT, 14251 }, 14252 { 14253 "reference tracking: release reference without check", 14254 .insns = { 14255 BPF_SK_LOOKUP, 14256 /* reference in r0 may be NULL */ 14257 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14258 BPF_MOV64_IMM(BPF_REG_2, 0), 14259 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14260 BPF_EXIT_INSN(), 14261 }, 14262 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14263 .errstr = "type=sock_or_null expected=sock", 14264 .result = REJECT, 14265 }, 14266 { 14267 "reference tracking: release reference", 14268 .insns = { 14269 BPF_SK_LOOKUP, 14270 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14271 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14272 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14273 BPF_EXIT_INSN(), 14274 }, 14275 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14276 .result = ACCEPT, 14277 }, 14278 { 14279 "reference tracking: release reference 2", 14280 .insns = { 14281 BPF_SK_LOOKUP, 14282 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14283 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 14284 BPF_EXIT_INSN(), 14285 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14286 BPF_EXIT_INSN(), 14287 }, 14288 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14289 .result = ACCEPT, 14290 }, 14291 { 14292 "reference tracking: release reference twice", 14293 .insns = { 14294 BPF_SK_LOOKUP, 14295 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14296 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14297 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14298 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14299 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14300 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14301 BPF_EXIT_INSN(), 14302 }, 14303 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14304 .errstr = "type=inv expected=sock", 14305 .result = REJECT, 14306 }, 14307 { 14308 "reference tracking: release reference twice inside branch", 14309 .insns = { 14310 BPF_SK_LOOKUP, 14311 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14312 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14313 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), /* goto end */ 14314 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14315 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14316 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14317 BPF_EXIT_INSN(), 14318 }, 14319 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14320 .errstr = "type=inv expected=sock", 14321 .result = REJECT, 14322 }, 14323 { 14324 "reference tracking: alloc, check, free in one subbranch", 14325 .insns = { 14326 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 14327 offsetof(struct __sk_buff, data)), 14328 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 14329 offsetof(struct __sk_buff, data_end)), 14330 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 14331 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 14332 /* if (offsetof(skb, mark) > data_len) exit; */ 14333 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 14334 BPF_EXIT_INSN(), 14335 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 14336 offsetof(struct __sk_buff, mark)), 14337 BPF_SK_LOOKUP, 14338 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 1), /* mark == 0? */ 14339 /* Leak reference in R0 */ 14340 BPF_EXIT_INSN(), 14341 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14342 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14343 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14344 BPF_EXIT_INSN(), 14345 }, 14346 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14347 .errstr = "Unreleased reference", 14348 .result = REJECT, 14349 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 14350 }, 14351 { 14352 "reference tracking: alloc, check, free in both subbranches", 14353 .insns = { 14354 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 14355 offsetof(struct __sk_buff, data)), 14356 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 14357 offsetof(struct __sk_buff, data_end)), 14358 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 14359 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 16), 14360 /* if (offsetof(skb, mark) > data_len) exit; */ 14361 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 14362 BPF_EXIT_INSN(), 14363 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_2, 14364 offsetof(struct __sk_buff, mark)), 14365 BPF_SK_LOOKUP, 14366 BPF_JMP_IMM(BPF_JEQ, BPF_REG_6, 0, 4), /* mark == 0? */ 14367 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14368 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14369 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14370 BPF_EXIT_INSN(), 14371 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), /* sk NULL? */ 14372 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14373 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14374 BPF_EXIT_INSN(), 14375 }, 14376 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14377 .result = ACCEPT, 14378 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 14379 }, 14380 { 14381 "reference tracking in call: free reference in subprog", 14382 .insns = { 14383 BPF_SK_LOOKUP, 14384 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 14385 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14386 BPF_MOV64_IMM(BPF_REG_0, 0), 14387 BPF_EXIT_INSN(), 14388 14389 /* subprog 1 */ 14390 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 14391 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 14392 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14393 BPF_EXIT_INSN(), 14394 }, 14395 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14396 .result = ACCEPT, 14397 }, 14398 { 14399 "pass modified ctx pointer to helper, 1", 14400 .insns = { 14401 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 14402 BPF_MOV64_IMM(BPF_REG_2, 0), 14403 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14404 BPF_FUNC_csum_update), 14405 BPF_MOV64_IMM(BPF_REG_0, 0), 14406 BPF_EXIT_INSN(), 14407 }, 14408 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14409 .result = REJECT, 14410 .errstr = "dereference of modified ctx ptr", 14411 }, 14412 { 14413 "pass modified ctx pointer to helper, 2", 14414 .insns = { 14415 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -612), 14416 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14417 BPF_FUNC_get_socket_cookie), 14418 BPF_MOV64_IMM(BPF_REG_0, 0), 14419 BPF_EXIT_INSN(), 14420 }, 14421 .result_unpriv = REJECT, 14422 .result = REJECT, 14423 .errstr_unpriv = "dereference of modified ctx ptr", 14424 .errstr = "dereference of modified ctx ptr", 14425 }, 14426 { 14427 "pass modified ctx pointer to helper, 3", 14428 .insns = { 14429 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 0), 14430 BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 4), 14431 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 14432 BPF_MOV64_IMM(BPF_REG_2, 0), 14433 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 14434 BPF_FUNC_csum_update), 14435 BPF_MOV64_IMM(BPF_REG_0, 0), 14436 BPF_EXIT_INSN(), 14437 }, 14438 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14439 .result = REJECT, 14440 .errstr = "variable ctx access var_off=(0x0; 0x4)", 14441 }, 14442 { 14443 "mov64 src == dst", 14444 .insns = { 14445 BPF_MOV64_IMM(BPF_REG_2, 0), 14446 BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 14447 // Check bounds are OK 14448 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 14449 BPF_MOV64_IMM(BPF_REG_0, 0), 14450 BPF_EXIT_INSN(), 14451 }, 14452 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14453 .result = ACCEPT, 14454 }, 14455 { 14456 "mov64 src != dst", 14457 .insns = { 14458 BPF_MOV64_IMM(BPF_REG_3, 0), 14459 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 14460 // Check bounds are OK 14461 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 14462 BPF_MOV64_IMM(BPF_REG_0, 0), 14463 BPF_EXIT_INSN(), 14464 }, 14465 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14466 .result = ACCEPT, 14467 }, 14468 { 14469 "allocated_stack", 14470 .insns = { 14471 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 14472 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 14473 BPF_ALU64_REG(BPF_MOV, BPF_REG_7, BPF_REG_0), 14474 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 14475 BPF_MOV64_IMM(BPF_REG_0, 0), 14476 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 14477 BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, -8), 14478 BPF_STX_MEM(BPF_B, BPF_REG_10, BPF_REG_7, -9), 14479 BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_10, -9), 14480 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14481 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14482 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14483 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 0), 14484 BPF_EXIT_INSN(), 14485 }, 14486 .result = ACCEPT, 14487 .result_unpriv = ACCEPT, 14488 .insn_processed = 15, 14489 }, 14490 { 14491 "masking, test out of bounds 1", 14492 .insns = { 14493 BPF_MOV32_IMM(BPF_REG_1, 5), 14494 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14495 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14496 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14497 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14498 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14499 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14500 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14501 BPF_EXIT_INSN(), 14502 }, 14503 .result = ACCEPT, 14504 .retval = 0, 14505 }, 14506 { 14507 "masking, test out of bounds 2", 14508 .insns = { 14509 BPF_MOV32_IMM(BPF_REG_1, 1), 14510 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14511 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14512 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14513 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14514 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14515 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14516 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14517 BPF_EXIT_INSN(), 14518 }, 14519 .result = ACCEPT, 14520 .retval = 0, 14521 }, 14522 { 14523 "masking, test out of bounds 3", 14524 .insns = { 14525 BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), 14526 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14527 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14528 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14529 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14530 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14531 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14532 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14533 BPF_EXIT_INSN(), 14534 }, 14535 .result = ACCEPT, 14536 .retval = 0, 14537 }, 14538 { 14539 "masking, test out of bounds 4", 14540 .insns = { 14541 BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), 14542 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14543 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14544 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14545 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14546 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14547 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14548 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14549 BPF_EXIT_INSN(), 14550 }, 14551 .result = ACCEPT, 14552 .retval = 0, 14553 }, 14554 { 14555 "masking, test out of bounds 5", 14556 .insns = { 14557 BPF_MOV32_IMM(BPF_REG_1, -1), 14558 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14559 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14560 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14561 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14562 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14563 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14564 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14565 BPF_EXIT_INSN(), 14566 }, 14567 .result = ACCEPT, 14568 .retval = 0, 14569 }, 14570 { 14571 "masking, test out of bounds 6", 14572 .insns = { 14573 BPF_MOV32_IMM(BPF_REG_1, -1), 14574 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14575 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14576 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14577 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14578 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14579 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14580 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14581 BPF_EXIT_INSN(), 14582 }, 14583 .result = ACCEPT, 14584 .retval = 0, 14585 }, 14586 { 14587 "masking, test out of bounds 7", 14588 .insns = { 14589 BPF_MOV64_IMM(BPF_REG_1, 5), 14590 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14591 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14592 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14593 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14594 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14595 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14596 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14597 BPF_EXIT_INSN(), 14598 }, 14599 .result = ACCEPT, 14600 .retval = 0, 14601 }, 14602 { 14603 "masking, test out of bounds 8", 14604 .insns = { 14605 BPF_MOV64_IMM(BPF_REG_1, 1), 14606 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14607 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14608 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14609 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14610 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14611 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14612 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14613 BPF_EXIT_INSN(), 14614 }, 14615 .result = ACCEPT, 14616 .retval = 0, 14617 }, 14618 { 14619 "masking, test out of bounds 9", 14620 .insns = { 14621 BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), 14622 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14623 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14624 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14625 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14626 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14627 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14628 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14629 BPF_EXIT_INSN(), 14630 }, 14631 .result = ACCEPT, 14632 .retval = 0, 14633 }, 14634 { 14635 "masking, test out of bounds 10", 14636 .insns = { 14637 BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), 14638 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14639 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14640 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14641 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14642 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14643 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14644 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14645 BPF_EXIT_INSN(), 14646 }, 14647 .result = ACCEPT, 14648 .retval = 0, 14649 }, 14650 { 14651 "masking, test out of bounds 11", 14652 .insns = { 14653 BPF_MOV64_IMM(BPF_REG_1, -1), 14654 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14655 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14656 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14657 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14658 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14659 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14660 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14661 BPF_EXIT_INSN(), 14662 }, 14663 .result = ACCEPT, 14664 .retval = 0, 14665 }, 14666 { 14667 "masking, test out of bounds 12", 14668 .insns = { 14669 BPF_MOV64_IMM(BPF_REG_1, -1), 14670 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14671 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14672 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14673 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14674 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14675 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14676 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14677 BPF_EXIT_INSN(), 14678 }, 14679 .result = ACCEPT, 14680 .retval = 0, 14681 }, 14682 { 14683 "masking, test in bounds 1", 14684 .insns = { 14685 BPF_MOV32_IMM(BPF_REG_1, 4), 14686 BPF_MOV32_IMM(BPF_REG_2, 5 - 1), 14687 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14688 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14689 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14690 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14691 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14692 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14693 BPF_EXIT_INSN(), 14694 }, 14695 .result = ACCEPT, 14696 .retval = 4, 14697 }, 14698 { 14699 "masking, test in bounds 2", 14700 .insns = { 14701 BPF_MOV32_IMM(BPF_REG_1, 0), 14702 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14703 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14704 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14705 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14706 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14707 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14708 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14709 BPF_EXIT_INSN(), 14710 }, 14711 .result = ACCEPT, 14712 .retval = 0, 14713 }, 14714 { 14715 "masking, test in bounds 3", 14716 .insns = { 14717 BPF_MOV32_IMM(BPF_REG_1, 0xfffffffe), 14718 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), 14719 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14720 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14721 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14722 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14723 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14724 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14725 BPF_EXIT_INSN(), 14726 }, 14727 .result = ACCEPT, 14728 .retval = 0xfffffffe, 14729 }, 14730 { 14731 "masking, test in bounds 4", 14732 .insns = { 14733 BPF_MOV32_IMM(BPF_REG_1, 0xabcde), 14734 BPF_MOV32_IMM(BPF_REG_2, 0xabcdef - 1), 14735 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14736 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14737 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14738 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14739 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14740 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14741 BPF_EXIT_INSN(), 14742 }, 14743 .result = ACCEPT, 14744 .retval = 0xabcde, 14745 }, 14746 { 14747 "masking, test in bounds 5", 14748 .insns = { 14749 BPF_MOV32_IMM(BPF_REG_1, 0), 14750 BPF_MOV32_IMM(BPF_REG_2, 1 - 1), 14751 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14752 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14753 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14754 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14755 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14756 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14757 BPF_EXIT_INSN(), 14758 }, 14759 .result = ACCEPT, 14760 .retval = 0, 14761 }, 14762 { 14763 "masking, test in bounds 6", 14764 .insns = { 14765 BPF_MOV32_IMM(BPF_REG_1, 46), 14766 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14767 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), 14768 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), 14769 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14770 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14771 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 14772 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 14773 BPF_EXIT_INSN(), 14774 }, 14775 .result = ACCEPT, 14776 .retval = 46, 14777 }, 14778 { 14779 "masking, test in bounds 7", 14780 .insns = { 14781 BPF_MOV64_IMM(BPF_REG_3, -46), 14782 BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), 14783 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14784 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), 14785 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), 14786 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14787 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14788 BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), 14789 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 14790 BPF_EXIT_INSN(), 14791 }, 14792 .result = ACCEPT, 14793 .retval = 46, 14794 }, 14795 { 14796 "masking, test in bounds 8", 14797 .insns = { 14798 BPF_MOV64_IMM(BPF_REG_3, -47), 14799 BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), 14800 BPF_MOV32_IMM(BPF_REG_2, 47 - 1), 14801 BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), 14802 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), 14803 BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), 14804 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), 14805 BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), 14806 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 14807 BPF_EXIT_INSN(), 14808 }, 14809 .result = ACCEPT, 14810 .retval = 0, 14811 }, 14812 { 14813 "reference tracking in call: free reference in subprog and outside", 14814 .insns = { 14815 BPF_SK_LOOKUP, 14816 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), /* unchecked reference */ 14817 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 14818 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 14819 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14820 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14821 BPF_EXIT_INSN(), 14822 14823 /* subprog 1 */ 14824 BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), 14825 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 1), 14826 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14827 BPF_EXIT_INSN(), 14828 }, 14829 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14830 .errstr = "type=inv expected=sock", 14831 .result = REJECT, 14832 }, 14833 { 14834 "reference tracking in call: alloc & leak reference in subprog", 14835 .insns = { 14836 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14837 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14838 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 14839 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14840 BPF_MOV64_IMM(BPF_REG_0, 0), 14841 BPF_EXIT_INSN(), 14842 14843 /* subprog 1 */ 14844 BPF_MOV64_REG(BPF_REG_6, BPF_REG_4), 14845 BPF_SK_LOOKUP, 14846 /* spill unchecked sk_ptr into stack of caller */ 14847 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 14848 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14849 BPF_EXIT_INSN(), 14850 }, 14851 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14852 .errstr = "Unreleased reference", 14853 .result = REJECT, 14854 }, 14855 { 14856 "reference tracking in call: alloc in subprog, release outside", 14857 .insns = { 14858 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14859 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 14860 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14861 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14862 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14863 BPF_EXIT_INSN(), 14864 14865 /* subprog 1 */ 14866 BPF_SK_LOOKUP, 14867 BPF_EXIT_INSN(), /* return sk */ 14868 }, 14869 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14870 .retval = POINTER_VALUE, 14871 .result = ACCEPT, 14872 }, 14873 { 14874 "reference tracking in call: sk_ptr leak into caller stack", 14875 .insns = { 14876 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14877 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14878 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14879 BPF_MOV64_IMM(BPF_REG_0, 0), 14880 BPF_EXIT_INSN(), 14881 14882 /* subprog 1 */ 14883 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 14884 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 14885 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 14886 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 14887 /* spill unchecked sk_ptr into stack of caller */ 14888 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 14889 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 14890 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 14891 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14892 BPF_EXIT_INSN(), 14893 14894 /* subprog 2 */ 14895 BPF_SK_LOOKUP, 14896 BPF_EXIT_INSN(), 14897 }, 14898 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14899 .errstr = "Unreleased reference", 14900 .result = REJECT, 14901 }, 14902 { 14903 "reference tracking in call: sk_ptr spill into caller stack", 14904 .insns = { 14905 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 14906 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 14907 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14908 BPF_MOV64_IMM(BPF_REG_0, 0), 14909 BPF_EXIT_INSN(), 14910 14911 /* subprog 1 */ 14912 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 14913 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 14914 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 14915 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 14916 /* spill unchecked sk_ptr into stack of caller */ 14917 BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), 14918 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, -8), 14919 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 14920 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_0, 0), 14921 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 14922 /* now the sk_ptr is verified, free the reference */ 14923 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_4, 0), 14924 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14925 BPF_EXIT_INSN(), 14926 14927 /* subprog 2 */ 14928 BPF_SK_LOOKUP, 14929 BPF_EXIT_INSN(), 14930 }, 14931 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14932 .result = ACCEPT, 14933 }, 14934 { 14935 "reference tracking: allow LD_ABS", 14936 .insns = { 14937 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14938 BPF_SK_LOOKUP, 14939 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14940 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14941 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14942 BPF_LD_ABS(BPF_B, 0), 14943 BPF_LD_ABS(BPF_H, 0), 14944 BPF_LD_ABS(BPF_W, 0), 14945 BPF_EXIT_INSN(), 14946 }, 14947 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14948 .result = ACCEPT, 14949 }, 14950 { 14951 "reference tracking: forbid LD_ABS while holding reference", 14952 .insns = { 14953 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14954 BPF_SK_LOOKUP, 14955 BPF_LD_ABS(BPF_B, 0), 14956 BPF_LD_ABS(BPF_H, 0), 14957 BPF_LD_ABS(BPF_W, 0), 14958 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14959 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14960 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14961 BPF_EXIT_INSN(), 14962 }, 14963 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14964 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 14965 .result = REJECT, 14966 }, 14967 { 14968 "reference tracking: allow LD_IND", 14969 .insns = { 14970 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14971 BPF_SK_LOOKUP, 14972 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 14973 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 14974 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14975 BPF_MOV64_IMM(BPF_REG_7, 1), 14976 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 14977 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 14978 BPF_EXIT_INSN(), 14979 }, 14980 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14981 .result = ACCEPT, 14982 .retval = 1, 14983 }, 14984 { 14985 "reference tracking: forbid LD_IND while holding reference", 14986 .insns = { 14987 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14988 BPF_SK_LOOKUP, 14989 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 14990 BPF_MOV64_IMM(BPF_REG_7, 1), 14991 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 14992 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 14993 BPF_MOV64_REG(BPF_REG_1, BPF_REG_4), 14994 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 14995 BPF_EMIT_CALL(BPF_FUNC_sk_release), 14996 BPF_EXIT_INSN(), 14997 }, 14998 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14999 .errstr = "BPF_LD_[ABS|IND] cannot be mixed with socket references", 15000 .result = REJECT, 15001 }, 15002 { 15003 "reference tracking: check reference or tail call", 15004 .insns = { 15005 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15006 BPF_SK_LOOKUP, 15007 /* if (sk) bpf_sk_release() */ 15008 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15009 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 7), 15010 /* bpf_tail_call() */ 15011 BPF_MOV64_IMM(BPF_REG_3, 2), 15012 BPF_LD_MAP_FD(BPF_REG_2, 0), 15013 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15014 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15015 BPF_FUNC_tail_call), 15016 BPF_MOV64_IMM(BPF_REG_0, 0), 15017 BPF_EXIT_INSN(), 15018 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15019 BPF_EXIT_INSN(), 15020 }, 15021 .fixup_prog1 = { 17 }, 15022 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15023 .result = ACCEPT, 15024 }, 15025 { 15026 "reference tracking: release reference then tail call", 15027 .insns = { 15028 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15029 BPF_SK_LOOKUP, 15030 /* if (sk) bpf_sk_release() */ 15031 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15032 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 15033 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15034 /* bpf_tail_call() */ 15035 BPF_MOV64_IMM(BPF_REG_3, 2), 15036 BPF_LD_MAP_FD(BPF_REG_2, 0), 15037 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15038 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15039 BPF_FUNC_tail_call), 15040 BPF_MOV64_IMM(BPF_REG_0, 0), 15041 BPF_EXIT_INSN(), 15042 }, 15043 .fixup_prog1 = { 18 }, 15044 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15045 .result = ACCEPT, 15046 }, 15047 { 15048 "reference tracking: leak possible reference over tail call", 15049 .insns = { 15050 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15051 /* Look up socket and store in REG_6 */ 15052 BPF_SK_LOOKUP, 15053 /* bpf_tail_call() */ 15054 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15055 BPF_MOV64_IMM(BPF_REG_3, 2), 15056 BPF_LD_MAP_FD(BPF_REG_2, 0), 15057 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15058 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15059 BPF_FUNC_tail_call), 15060 BPF_MOV64_IMM(BPF_REG_0, 0), 15061 /* if (sk) bpf_sk_release() */ 15062 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15063 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 15064 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15065 BPF_EXIT_INSN(), 15066 }, 15067 .fixup_prog1 = { 16 }, 15068 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15069 .errstr = "tail_call would lead to reference leak", 15070 .result = REJECT, 15071 }, 15072 { 15073 "reference tracking: leak checked reference over tail call", 15074 .insns = { 15075 BPF_MOV64_REG(BPF_REG_7, BPF_REG_1), 15076 /* Look up socket and store in REG_6 */ 15077 BPF_SK_LOOKUP, 15078 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15079 /* if (!sk) goto end */ 15080 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 15081 /* bpf_tail_call() */ 15082 BPF_MOV64_IMM(BPF_REG_3, 0), 15083 BPF_LD_MAP_FD(BPF_REG_2, 0), 15084 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 15085 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15086 BPF_FUNC_tail_call), 15087 BPF_MOV64_IMM(BPF_REG_0, 0), 15088 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15089 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15090 BPF_EXIT_INSN(), 15091 }, 15092 .fixup_prog1 = { 17 }, 15093 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15094 .errstr = "tail_call would lead to reference leak", 15095 .result = REJECT, 15096 }, 15097 { 15098 "reference tracking: mangle and release sock_or_null", 15099 .insns = { 15100 BPF_SK_LOOKUP, 15101 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15102 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 15103 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 15104 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15105 BPF_EXIT_INSN(), 15106 }, 15107 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15108 .errstr = "R1 pointer arithmetic on sock_or_null prohibited", 15109 .result = REJECT, 15110 }, 15111 { 15112 "reference tracking: mangle and release sock", 15113 .insns = { 15114 BPF_SK_LOOKUP, 15115 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15116 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 15117 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5), 15118 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15119 BPF_EXIT_INSN(), 15120 }, 15121 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15122 .errstr = "R1 pointer arithmetic on sock prohibited", 15123 .result = REJECT, 15124 }, 15125 { 15126 "reference tracking: access member", 15127 .insns = { 15128 BPF_SK_LOOKUP, 15129 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15130 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15131 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 15132 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15133 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15134 BPF_EXIT_INSN(), 15135 }, 15136 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15137 .result = ACCEPT, 15138 }, 15139 { 15140 "reference tracking: write to member", 15141 .insns = { 15142 BPF_SK_LOOKUP, 15143 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15144 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 15145 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15146 BPF_LD_IMM64(BPF_REG_2, 42), 15147 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_2, 15148 offsetof(struct bpf_sock, mark)), 15149 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15150 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15151 BPF_LD_IMM64(BPF_REG_0, 0), 15152 BPF_EXIT_INSN(), 15153 }, 15154 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15155 .errstr = "cannot write into socket", 15156 .result = REJECT, 15157 }, 15158 { 15159 "reference tracking: invalid 64-bit access of member", 15160 .insns = { 15161 BPF_SK_LOOKUP, 15162 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15163 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15164 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 15165 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15166 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15167 BPF_EXIT_INSN(), 15168 }, 15169 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15170 .errstr = "invalid bpf_sock access off=0 size=8", 15171 .result = REJECT, 15172 }, 15173 { 15174 "reference tracking: access after release", 15175 .insns = { 15176 BPF_SK_LOOKUP, 15177 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15178 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 15179 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15180 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 15181 BPF_EXIT_INSN(), 15182 }, 15183 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15184 .errstr = "!read_ok", 15185 .result = REJECT, 15186 }, 15187 { 15188 "reference tracking: direct access for lookup", 15189 .insns = { 15190 /* Check that the packet is at least 64B long */ 15191 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15192 offsetof(struct __sk_buff, data)), 15193 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15194 offsetof(struct __sk_buff, data_end)), 15195 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 15196 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 15197 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 15198 /* sk = sk_lookup_tcp(ctx, skb->data, ...) */ 15199 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct bpf_sock_tuple)), 15200 BPF_MOV64_IMM(BPF_REG_4, 0), 15201 BPF_MOV64_IMM(BPF_REG_5, 0), 15202 BPF_EMIT_CALL(BPF_FUNC_sk_lookup_tcp), 15203 BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 15204 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 15205 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4), 15206 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15207 BPF_EMIT_CALL(BPF_FUNC_sk_release), 15208 BPF_EXIT_INSN(), 15209 }, 15210 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15211 .result = ACCEPT, 15212 }, 15213 { 15214 "calls: ctx read at start of subprog", 15215 .insns = { 15216 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15217 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 15218 BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0), 15219 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15220 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 15221 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15222 BPF_EXIT_INSN(), 15223 BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 15224 BPF_MOV64_IMM(BPF_REG_0, 0), 15225 BPF_EXIT_INSN(), 15226 }, 15227 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15228 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 15229 .result_unpriv = REJECT, 15230 .result = ACCEPT, 15231 }, 15232 { 15233 "check wire_len is not readable by sockets", 15234 .insns = { 15235 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 15236 offsetof(struct __sk_buff, wire_len)), 15237 BPF_EXIT_INSN(), 15238 }, 15239 .errstr = "invalid bpf_context access", 15240 .result = REJECT, 15241 }, 15242 { 15243 "check wire_len is readable by tc classifier", 15244 .insns = { 15245 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 15246 offsetof(struct __sk_buff, wire_len)), 15247 BPF_EXIT_INSN(), 15248 }, 15249 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15250 .result = ACCEPT, 15251 }, 15252 { 15253 "check wire_len is not writable by tc classifier", 15254 .insns = { 15255 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 15256 offsetof(struct __sk_buff, wire_len)), 15257 BPF_EXIT_INSN(), 15258 }, 15259 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15260 .errstr = "invalid bpf_context access", 15261 .errstr_unpriv = "R1 leaks addr", 15262 .result = REJECT, 15263 }, 15264 { 15265 "calls: cross frame pruning", 15266 .insns = { 15267 /* r8 = !!random(); 15268 * call pruner() 15269 * if (r8) 15270 * do something bad; 15271 */ 15272 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15273 BPF_FUNC_get_prandom_u32), 15274 BPF_MOV64_IMM(BPF_REG_8, 0), 15275 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 15276 BPF_MOV64_IMM(BPF_REG_8, 1), 15277 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 15278 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 15279 BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1), 15280 BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 15281 BPF_MOV64_IMM(BPF_REG_0, 0), 15282 BPF_EXIT_INSN(), 15283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 15284 BPF_EXIT_INSN(), 15285 }, 15286 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15287 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 15288 .errstr = "!read_ok", 15289 .result = REJECT, 15290 }, 15291 { 15292 "jset: functional", 15293 .insns = { 15294 /* r0 = 0 */ 15295 BPF_MOV64_IMM(BPF_REG_0, 0), 15296 /* prep for direct packet access via r2 */ 15297 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15298 offsetof(struct __sk_buff, data)), 15299 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15300 offsetof(struct __sk_buff, data_end)), 15301 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 15302 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 15303 BPF_JMP_REG(BPF_JLE, BPF_REG_4, BPF_REG_3, 1), 15304 BPF_EXIT_INSN(), 15305 15306 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 15307 15308 /* reg, bit 63 or bit 0 set, taken */ 15309 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001), 15310 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 15311 BPF_EXIT_INSN(), 15312 15313 /* reg, bit 62, not taken */ 15314 BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000), 15315 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1), 15316 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15317 BPF_EXIT_INSN(), 15318 15319 /* imm, any bit set, taken */ 15320 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1), 15321 BPF_EXIT_INSN(), 15322 15323 /* imm, bit 31 set, taken */ 15324 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 15325 BPF_EXIT_INSN(), 15326 15327 /* all good - return r0 == 2 */ 15328 BPF_MOV64_IMM(BPF_REG_0, 2), 15329 BPF_EXIT_INSN(), 15330 }, 15331 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15332 .result = ACCEPT, 15333 .runs = 7, 15334 .retvals = { 15335 { .retval = 2, 15336 .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), } 15337 }, 15338 { .retval = 2, 15339 .data64 = { (1ULL << 63) | (1U << 31), } 15340 }, 15341 { .retval = 2, 15342 .data64 = { (1ULL << 31) | (1U << 0), } 15343 }, 15344 { .retval = 2, 15345 .data64 = { (__u32)-1, } 15346 }, 15347 { .retval = 2, 15348 .data64 = { ~0x4000000000000000ULL, } 15349 }, 15350 { .retval = 0, 15351 .data64 = { 0, } 15352 }, 15353 { .retval = 0, 15354 .data64 = { ~0ULL, } 15355 }, 15356 }, 15357 }, 15358 { 15359 "jset: sign-extend", 15360 .insns = { 15361 /* r0 = 0 */ 15362 BPF_MOV64_IMM(BPF_REG_0, 0), 15363 /* prep for direct packet access via r2 */ 15364 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15365 offsetof(struct __sk_buff, data)), 15366 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15367 offsetof(struct __sk_buff, data_end)), 15368 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 15369 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 15370 BPF_JMP_REG(BPF_JLE, BPF_REG_4, BPF_REG_3, 1), 15371 BPF_EXIT_INSN(), 15372 15373 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0), 15374 15375 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1), 15376 BPF_EXIT_INSN(), 15377 15378 BPF_MOV64_IMM(BPF_REG_0, 2), 15379 BPF_EXIT_INSN(), 15380 }, 15381 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15382 .result = ACCEPT, 15383 .retval = 2, 15384 .data = { 1, 0, 0, 0, 0, 0, 0, 1, }, 15385 }, 15386 { 15387 "jset: known const compare", 15388 .insns = { 15389 BPF_MOV64_IMM(BPF_REG_0, 1), 15390 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15391 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15392 BPF_EXIT_INSN(), 15393 }, 15394 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15395 .retval_unpriv = 1, 15396 .result_unpriv = ACCEPT, 15397 .retval = 1, 15398 .result = ACCEPT, 15399 }, 15400 { 15401 "jset: known const compare bad", 15402 .insns = { 15403 BPF_MOV64_IMM(BPF_REG_0, 0), 15404 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15405 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15406 BPF_EXIT_INSN(), 15407 }, 15408 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15409 .errstr_unpriv = "!read_ok", 15410 .result_unpriv = REJECT, 15411 .errstr = "!read_ok", 15412 .result = REJECT, 15413 }, 15414 { 15415 "jset: unknown const compare taken", 15416 .insns = { 15417 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15418 BPF_FUNC_get_prandom_u32), 15419 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15420 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15421 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15422 BPF_EXIT_INSN(), 15423 }, 15424 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15425 .errstr_unpriv = "!read_ok", 15426 .result_unpriv = REJECT, 15427 .errstr = "!read_ok", 15428 .result = REJECT, 15429 }, 15430 { 15431 "jset: unknown const compare not taken", 15432 .insns = { 15433 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15434 BPF_FUNC_get_prandom_u32), 15435 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1), 15436 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15437 BPF_EXIT_INSN(), 15438 }, 15439 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15440 .errstr_unpriv = "!read_ok", 15441 .result_unpriv = REJECT, 15442 .errstr = "!read_ok", 15443 .result = REJECT, 15444 }, 15445 { 15446 "jset: half-known const compare", 15447 .insns = { 15448 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15449 BPF_FUNC_get_prandom_u32), 15450 BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2), 15451 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1), 15452 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15453 BPF_MOV64_IMM(BPF_REG_0, 0), 15454 BPF_EXIT_INSN(), 15455 }, 15456 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15457 .result_unpriv = ACCEPT, 15458 .result = ACCEPT, 15459 }, 15460 { 15461 "jset: range", 15462 .insns = { 15463 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15464 BPF_FUNC_get_prandom_u32), 15465 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 15466 BPF_MOV64_IMM(BPF_REG_0, 0), 15467 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff), 15468 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3), 15469 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1), 15470 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15471 BPF_EXIT_INSN(), 15472 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1), 15473 BPF_EXIT_INSN(), 15474 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1), 15475 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0), 15476 BPF_EXIT_INSN(), 15477 }, 15478 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 15479 .result_unpriv = ACCEPT, 15480 .result = ACCEPT, 15481 }, 15482 }; 15483 15484 static int probe_filter_length(const struct bpf_insn *fp) 15485 { 15486 int len; 15487 15488 for (len = MAX_INSNS - 1; len > 0; --len) 15489 if (fp[len].code != 0 || fp[len].imm != 0) 15490 break; 15491 return len + 1; 15492 } 15493 15494 static int create_map(uint32_t type, uint32_t size_key, 15495 uint32_t size_value, uint32_t max_elem) 15496 { 15497 int fd; 15498 15499 fd = bpf_create_map(type, size_key, size_value, max_elem, 15500 type == BPF_MAP_TYPE_HASH ? BPF_F_NO_PREALLOC : 0); 15501 if (fd < 0) 15502 printf("Failed to create hash map '%s'!\n", strerror(errno)); 15503 15504 return fd; 15505 } 15506 15507 static void update_map(int fd, int index) 15508 { 15509 struct test_val value = { 15510 .index = (6 + 1) * sizeof(int), 15511 .foo[6] = 0xabcdef12, 15512 }; 15513 15514 assert(!bpf_map_update_elem(fd, &index, &value, 0)); 15515 } 15516 15517 static int create_prog_dummy1(enum bpf_prog_type prog_type) 15518 { 15519 struct bpf_insn prog[] = { 15520 BPF_MOV64_IMM(BPF_REG_0, 42), 15521 BPF_EXIT_INSN(), 15522 }; 15523 15524 return bpf_load_program(prog_type, prog, 15525 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 15526 } 15527 15528 static int create_prog_dummy2(enum bpf_prog_type prog_type, int mfd, int idx) 15529 { 15530 struct bpf_insn prog[] = { 15531 BPF_MOV64_IMM(BPF_REG_3, idx), 15532 BPF_LD_MAP_FD(BPF_REG_2, mfd), 15533 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 15534 BPF_FUNC_tail_call), 15535 BPF_MOV64_IMM(BPF_REG_0, 41), 15536 BPF_EXIT_INSN(), 15537 }; 15538 15539 return bpf_load_program(prog_type, prog, 15540 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 15541 } 15542 15543 static int create_prog_array(enum bpf_prog_type prog_type, uint32_t max_elem, 15544 int p1key) 15545 { 15546 int p2key = 1; 15547 int mfd, p1fd, p2fd; 15548 15549 mfd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int), 15550 sizeof(int), max_elem, 0); 15551 if (mfd < 0) { 15552 printf("Failed to create prog array '%s'!\n", strerror(errno)); 15553 return -1; 15554 } 15555 15556 p1fd = create_prog_dummy1(prog_type); 15557 p2fd = create_prog_dummy2(prog_type, mfd, p2key); 15558 if (p1fd < 0 || p2fd < 0) 15559 goto out; 15560 if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0) 15561 goto out; 15562 if (bpf_map_update_elem(mfd, &p2key, &p2fd, BPF_ANY) < 0) 15563 goto out; 15564 close(p2fd); 15565 close(p1fd); 15566 15567 return mfd; 15568 out: 15569 close(p2fd); 15570 close(p1fd); 15571 close(mfd); 15572 return -1; 15573 } 15574 15575 static int create_map_in_map(void) 15576 { 15577 int inner_map_fd, outer_map_fd; 15578 15579 inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 15580 sizeof(int), 1, 0); 15581 if (inner_map_fd < 0) { 15582 printf("Failed to create array '%s'!\n", strerror(errno)); 15583 return inner_map_fd; 15584 } 15585 15586 outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL, 15587 sizeof(int), inner_map_fd, 1, 0); 15588 if (outer_map_fd < 0) 15589 printf("Failed to create array of maps '%s'!\n", 15590 strerror(errno)); 15591 15592 close(inner_map_fd); 15593 15594 return outer_map_fd; 15595 } 15596 15597 static int create_cgroup_storage(bool percpu) 15598 { 15599 enum bpf_map_type type = percpu ? BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE : 15600 BPF_MAP_TYPE_CGROUP_STORAGE; 15601 int fd; 15602 15603 fd = bpf_create_map(type, sizeof(struct bpf_cgroup_storage_key), 15604 TEST_DATA_LEN, 0, 0); 15605 if (fd < 0) 15606 printf("Failed to create cgroup storage '%s'!\n", 15607 strerror(errno)); 15608 15609 return fd; 15610 } 15611 15612 static char bpf_vlog[UINT_MAX >> 8]; 15613 15614 static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type, 15615 struct bpf_insn *prog, int *map_fds) 15616 { 15617 int *fixup_map_hash_8b = test->fixup_map_hash_8b; 15618 int *fixup_map_hash_48b = test->fixup_map_hash_48b; 15619 int *fixup_map_hash_16b = test->fixup_map_hash_16b; 15620 int *fixup_map_array_48b = test->fixup_map_array_48b; 15621 int *fixup_map_sockmap = test->fixup_map_sockmap; 15622 int *fixup_map_sockhash = test->fixup_map_sockhash; 15623 int *fixup_map_xskmap = test->fixup_map_xskmap; 15624 int *fixup_map_stacktrace = test->fixup_map_stacktrace; 15625 int *fixup_prog1 = test->fixup_prog1; 15626 int *fixup_prog2 = test->fixup_prog2; 15627 int *fixup_map_in_map = test->fixup_map_in_map; 15628 int *fixup_cgroup_storage = test->fixup_cgroup_storage; 15629 int *fixup_percpu_cgroup_storage = test->fixup_percpu_cgroup_storage; 15630 15631 if (test->fill_helper) 15632 test->fill_helper(test); 15633 15634 /* Allocating HTs with 1 elem is fine here, since we only test 15635 * for verifier and not do a runtime lookup, so the only thing 15636 * that really matters is value size in this case. 15637 */ 15638 if (*fixup_map_hash_8b) { 15639 map_fds[0] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15640 sizeof(long long), 1); 15641 do { 15642 prog[*fixup_map_hash_8b].imm = map_fds[0]; 15643 fixup_map_hash_8b++; 15644 } while (*fixup_map_hash_8b); 15645 } 15646 15647 if (*fixup_map_hash_48b) { 15648 map_fds[1] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15649 sizeof(struct test_val), 1); 15650 do { 15651 prog[*fixup_map_hash_48b].imm = map_fds[1]; 15652 fixup_map_hash_48b++; 15653 } while (*fixup_map_hash_48b); 15654 } 15655 15656 if (*fixup_map_hash_16b) { 15657 map_fds[2] = create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 15658 sizeof(struct other_val), 1); 15659 do { 15660 prog[*fixup_map_hash_16b].imm = map_fds[2]; 15661 fixup_map_hash_16b++; 15662 } while (*fixup_map_hash_16b); 15663 } 15664 15665 if (*fixup_map_array_48b) { 15666 map_fds[3] = create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 15667 sizeof(struct test_val), 1); 15668 update_map(map_fds[3], 0); 15669 do { 15670 prog[*fixup_map_array_48b].imm = map_fds[3]; 15671 fixup_map_array_48b++; 15672 } while (*fixup_map_array_48b); 15673 } 15674 15675 if (*fixup_prog1) { 15676 map_fds[4] = create_prog_array(prog_type, 4, 0); 15677 do { 15678 prog[*fixup_prog1].imm = map_fds[4]; 15679 fixup_prog1++; 15680 } while (*fixup_prog1); 15681 } 15682 15683 if (*fixup_prog2) { 15684 map_fds[5] = create_prog_array(prog_type, 8, 7); 15685 do { 15686 prog[*fixup_prog2].imm = map_fds[5]; 15687 fixup_prog2++; 15688 } while (*fixup_prog2); 15689 } 15690 15691 if (*fixup_map_in_map) { 15692 map_fds[6] = create_map_in_map(); 15693 do { 15694 prog[*fixup_map_in_map].imm = map_fds[6]; 15695 fixup_map_in_map++; 15696 } while (*fixup_map_in_map); 15697 } 15698 15699 if (*fixup_cgroup_storage) { 15700 map_fds[7] = create_cgroup_storage(false); 15701 do { 15702 prog[*fixup_cgroup_storage].imm = map_fds[7]; 15703 fixup_cgroup_storage++; 15704 } while (*fixup_cgroup_storage); 15705 } 15706 15707 if (*fixup_percpu_cgroup_storage) { 15708 map_fds[8] = create_cgroup_storage(true); 15709 do { 15710 prog[*fixup_percpu_cgroup_storage].imm = map_fds[8]; 15711 fixup_percpu_cgroup_storage++; 15712 } while (*fixup_percpu_cgroup_storage); 15713 } 15714 if (*fixup_map_sockmap) { 15715 map_fds[9] = create_map(BPF_MAP_TYPE_SOCKMAP, sizeof(int), 15716 sizeof(int), 1); 15717 do { 15718 prog[*fixup_map_sockmap].imm = map_fds[9]; 15719 fixup_map_sockmap++; 15720 } while (*fixup_map_sockmap); 15721 } 15722 if (*fixup_map_sockhash) { 15723 map_fds[10] = create_map(BPF_MAP_TYPE_SOCKHASH, sizeof(int), 15724 sizeof(int), 1); 15725 do { 15726 prog[*fixup_map_sockhash].imm = map_fds[10]; 15727 fixup_map_sockhash++; 15728 } while (*fixup_map_sockhash); 15729 } 15730 if (*fixup_map_xskmap) { 15731 map_fds[11] = create_map(BPF_MAP_TYPE_XSKMAP, sizeof(int), 15732 sizeof(int), 1); 15733 do { 15734 prog[*fixup_map_xskmap].imm = map_fds[11]; 15735 fixup_map_xskmap++; 15736 } while (*fixup_map_xskmap); 15737 } 15738 if (*fixup_map_stacktrace) { 15739 map_fds[12] = create_map(BPF_MAP_TYPE_STACK_TRACE, sizeof(u32), 15740 sizeof(u64), 1); 15741 do { 15742 prog[*fixup_map_stacktrace].imm = map_fds[12]; 15743 fixup_map_stacktrace++; 15744 } while (*fixup_map_stacktrace); 15745 } 15746 } 15747 15748 static int set_admin(bool admin) 15749 { 15750 cap_t caps; 15751 const cap_value_t cap_val = CAP_SYS_ADMIN; 15752 int ret = -1; 15753 15754 caps = cap_get_proc(); 15755 if (!caps) { 15756 perror("cap_get_proc"); 15757 return -1; 15758 } 15759 if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val, 15760 admin ? CAP_SET : CAP_CLEAR)) { 15761 perror("cap_set_flag"); 15762 goto out; 15763 } 15764 if (cap_set_proc(caps)) { 15765 perror("cap_set_proc"); 15766 goto out; 15767 } 15768 ret = 0; 15769 out: 15770 if (cap_free(caps)) 15771 perror("cap_free"); 15772 return ret; 15773 } 15774 15775 static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val, 15776 void *data, size_t size_data) 15777 { 15778 __u8 tmp[TEST_DATA_LEN << 2]; 15779 __u32 size_tmp = sizeof(tmp); 15780 uint32_t retval; 15781 int err; 15782 15783 if (unpriv) 15784 set_admin(true); 15785 err = bpf_prog_test_run(fd_prog, 1, data, size_data, 15786 tmp, &size_tmp, &retval, NULL); 15787 if (unpriv) 15788 set_admin(false); 15789 if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) { 15790 printf("Unexpected bpf_prog_test_run error "); 15791 return err; 15792 } 15793 if (!err && retval != expected_val && 15794 expected_val != POINTER_VALUE) { 15795 printf("FAIL retval %d != %d ", retval, expected_val); 15796 return 1; 15797 } 15798 15799 return 0; 15800 } 15801 15802 static void do_test_single(struct bpf_test *test, bool unpriv, 15803 int *passes, int *errors) 15804 { 15805 int fd_prog, expected_ret, alignment_prevented_execution; 15806 int prog_len, prog_type = test->prog_type; 15807 struct bpf_insn *prog = test->insns; 15808 int run_errs, run_successes; 15809 int map_fds[MAX_NR_MAPS]; 15810 const char *expected_err; 15811 __u32 pflags; 15812 int i, err; 15813 15814 for (i = 0; i < MAX_NR_MAPS; i++) 15815 map_fds[i] = -1; 15816 15817 if (!prog_type) 15818 prog_type = BPF_PROG_TYPE_SOCKET_FILTER; 15819 do_test_fixup(test, prog_type, prog, map_fds); 15820 prog_len = probe_filter_length(prog); 15821 15822 pflags = 0; 15823 if (test->flags & F_LOAD_WITH_STRICT_ALIGNMENT) 15824 pflags |= BPF_F_STRICT_ALIGNMENT; 15825 if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) 15826 pflags |= BPF_F_ANY_ALIGNMENT; 15827 fd_prog = bpf_verify_program(prog_type, prog, prog_len, pflags, 15828 "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); 15829 15830 expected_ret = unpriv && test->result_unpriv != UNDEF ? 15831 test->result_unpriv : test->result; 15832 expected_err = unpriv && test->errstr_unpriv ? 15833 test->errstr_unpriv : test->errstr; 15834 15835 alignment_prevented_execution = 0; 15836 15837 if (expected_ret == ACCEPT) { 15838 if (fd_prog < 0) { 15839 printf("FAIL\nFailed to load prog '%s'!\n", 15840 strerror(errno)); 15841 goto fail_log; 15842 } 15843 #ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 15844 if (fd_prog >= 0 && 15845 (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)) 15846 alignment_prevented_execution = 1; 15847 #endif 15848 } else { 15849 if (fd_prog >= 0) { 15850 printf("FAIL\nUnexpected success to load!\n"); 15851 goto fail_log; 15852 } 15853 if (!strstr(bpf_vlog, expected_err)) { 15854 printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n", 15855 expected_err, bpf_vlog); 15856 goto fail_log; 15857 } 15858 } 15859 15860 if (test->insn_processed) { 15861 uint32_t insn_processed; 15862 char *proc; 15863 15864 proc = strstr(bpf_vlog, "processed "); 15865 insn_processed = atoi(proc + 10); 15866 if (test->insn_processed != insn_processed) { 15867 printf("FAIL\nUnexpected insn_processed %u vs %u\n", 15868 insn_processed, test->insn_processed); 15869 goto fail_log; 15870 } 15871 } 15872 15873 run_errs = 0; 15874 run_successes = 0; 15875 if (!alignment_prevented_execution && fd_prog >= 0) { 15876 uint32_t expected_val; 15877 int i; 15878 15879 if (!test->runs) { 15880 expected_val = unpriv && test->retval_unpriv ? 15881 test->retval_unpriv : test->retval; 15882 15883 err = do_prog_test_run(fd_prog, unpriv, expected_val, 15884 test->data, sizeof(test->data)); 15885 if (err) 15886 run_errs++; 15887 else 15888 run_successes++; 15889 } 15890 15891 for (i = 0; i < test->runs; i++) { 15892 if (unpriv && test->retvals[i].retval_unpriv) 15893 expected_val = test->retvals[i].retval_unpriv; 15894 else 15895 expected_val = test->retvals[i].retval; 15896 15897 err = do_prog_test_run(fd_prog, unpriv, expected_val, 15898 test->retvals[i].data, 15899 sizeof(test->retvals[i].data)); 15900 if (err) { 15901 printf("(run %d/%d) ", i + 1, test->runs); 15902 run_errs++; 15903 } else { 15904 run_successes++; 15905 } 15906 } 15907 } 15908 15909 if (!run_errs) { 15910 (*passes)++; 15911 if (run_successes > 1) 15912 printf("%d cases ", run_successes); 15913 printf("OK"); 15914 if (alignment_prevented_execution) 15915 printf(" (NOTE: not executed due to unknown alignment)"); 15916 printf("\n"); 15917 } else { 15918 printf("\n"); 15919 goto fail_log; 15920 } 15921 close_fds: 15922 close(fd_prog); 15923 for (i = 0; i < MAX_NR_MAPS; i++) 15924 close(map_fds[i]); 15925 sched_yield(); 15926 return; 15927 fail_log: 15928 (*errors)++; 15929 printf("%s", bpf_vlog); 15930 goto close_fds; 15931 } 15932 15933 static bool is_admin(void) 15934 { 15935 cap_t caps; 15936 cap_flag_value_t sysadmin = CAP_CLEAR; 15937 const cap_value_t cap_val = CAP_SYS_ADMIN; 15938 15939 #ifdef CAP_IS_SUPPORTED 15940 if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) { 15941 perror("cap_get_flag"); 15942 return false; 15943 } 15944 #endif 15945 caps = cap_get_proc(); 15946 if (!caps) { 15947 perror("cap_get_proc"); 15948 return false; 15949 } 15950 if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin)) 15951 perror("cap_get_flag"); 15952 if (cap_free(caps)) 15953 perror("cap_free"); 15954 return (sysadmin == CAP_SET); 15955 } 15956 15957 static void get_unpriv_disabled() 15958 { 15959 char buf[2]; 15960 FILE *fd; 15961 15962 fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r"); 15963 if (!fd) { 15964 perror("fopen /proc/sys/"UNPRIV_SYSCTL); 15965 unpriv_disabled = true; 15966 return; 15967 } 15968 if (fgets(buf, 2, fd) == buf && atoi(buf)) 15969 unpriv_disabled = true; 15970 fclose(fd); 15971 } 15972 15973 static bool test_as_unpriv(struct bpf_test *test) 15974 { 15975 return !test->prog_type || 15976 test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER || 15977 test->prog_type == BPF_PROG_TYPE_CGROUP_SKB; 15978 } 15979 15980 static int do_test(bool unpriv, unsigned int from, unsigned int to) 15981 { 15982 int i, passes = 0, errors = 0, skips = 0; 15983 15984 for (i = from; i < to; i++) { 15985 struct bpf_test *test = &tests[i]; 15986 15987 /* Program types that are not supported by non-root we 15988 * skip right away. 15989 */ 15990 if (test_as_unpriv(test) && unpriv_disabled) { 15991 printf("#%d/u %s SKIP\n", i, test->descr); 15992 skips++; 15993 } else if (test_as_unpriv(test)) { 15994 if (!unpriv) 15995 set_admin(false); 15996 printf("#%d/u %s ", i, test->descr); 15997 do_test_single(test, true, &passes, &errors); 15998 if (!unpriv) 15999 set_admin(true); 16000 } 16001 16002 if (unpriv) { 16003 printf("#%d/p %s SKIP\n", i, test->descr); 16004 skips++; 16005 } else { 16006 printf("#%d/p %s ", i, test->descr); 16007 do_test_single(test, false, &passes, &errors); 16008 } 16009 } 16010 16011 printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes, 16012 skips, errors); 16013 return errors ? EXIT_FAILURE : EXIT_SUCCESS; 16014 } 16015 16016 int main(int argc, char **argv) 16017 { 16018 unsigned int from = 0, to = ARRAY_SIZE(tests); 16019 bool unpriv = !is_admin(); 16020 16021 if (argc == 3) { 16022 unsigned int l = atoi(argv[argc - 2]); 16023 unsigned int u = atoi(argv[argc - 1]); 16024 16025 if (l < to && u < to) { 16026 from = l; 16027 to = u + 1; 16028 } 16029 } else if (argc == 2) { 16030 unsigned int t = atoi(argv[argc - 1]); 16031 16032 if (t < to) { 16033 from = t; 16034 to = t + 1; 16035 } 16036 } 16037 16038 get_unpriv_disabled(); 16039 if (unpriv && unpriv_disabled) { 16040 printf("Cannot run as unprivileged user with sysctl %s.\n", 16041 UNPRIV_SYSCTL); 16042 return EXIT_FAILURE; 16043 } 16044 16045 bpf_semi_rand_init(); 16046 return do_test(unpriv, from, to); 16047 } 16048