1 /* 2 * Testsuite for eBPF verifier 3 * 4 * Copyright (c) 2014 PLUMgrid, http://plumgrid.com 5 * Copyright (c) 2017 Facebook 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of version 2 of the GNU General Public 9 * License as published by the Free Software Foundation. 10 */ 11 12 #include <endian.h> 13 #include <asm/types.h> 14 #include <linux/types.h> 15 #include <stdint.h> 16 #include <stdio.h> 17 #include <stdlib.h> 18 #include <unistd.h> 19 #include <errno.h> 20 #include <string.h> 21 #include <stddef.h> 22 #include <stdbool.h> 23 #include <sched.h> 24 #include <limits.h> 25 26 #include <sys/capability.h> 27 28 #include <linux/unistd.h> 29 #include <linux/filter.h> 30 #include <linux/bpf_perf_event.h> 31 #include <linux/bpf.h> 32 #include <linux/if_ether.h> 33 34 #include <bpf/bpf.h> 35 36 #ifdef HAVE_GENHDR 37 # include "autoconf.h" 38 #else 39 # if defined(__i386) || defined(__x86_64) || defined(__s390x__) || defined(__aarch64__) 40 # define CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 1 41 # endif 42 #endif 43 #include "bpf_rlimit.h" 44 #include "../../../include/linux/filter.h" 45 46 #ifndef ARRAY_SIZE 47 # define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 48 #endif 49 50 #define MAX_INSNS BPF_MAXINSNS 51 #define MAX_FIXUPS 8 52 #define MAX_NR_MAPS 4 53 #define POINTER_VALUE 0xcafe4all 54 #define TEST_DATA_LEN 64 55 56 #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) 57 #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) 58 59 #define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled" 60 static bool unpriv_disabled = false; 61 62 struct bpf_test { 63 const char *descr; 64 struct bpf_insn insns[MAX_INSNS]; 65 int fixup_map1[MAX_FIXUPS]; 66 int fixup_map2[MAX_FIXUPS]; 67 int fixup_map3[MAX_FIXUPS]; 68 int fixup_prog[MAX_FIXUPS]; 69 int fixup_map_in_map[MAX_FIXUPS]; 70 const char *errstr; 71 const char *errstr_unpriv; 72 uint32_t retval; 73 enum { 74 UNDEF, 75 ACCEPT, 76 REJECT 77 } result, result_unpriv; 78 enum bpf_prog_type prog_type; 79 uint8_t flags; 80 __u8 data[TEST_DATA_LEN]; 81 void (*fill_helper)(struct bpf_test *self); 82 }; 83 84 /* Note we want this to be 64 bit aligned so that the end of our array is 85 * actually the end of the structure. 86 */ 87 #define MAX_ENTRIES 11 88 89 struct test_val { 90 unsigned int index; 91 int foo[MAX_ENTRIES]; 92 }; 93 94 struct other_val { 95 long long foo; 96 long long bar; 97 }; 98 99 static void bpf_fill_ld_abs_vlan_push_pop(struct bpf_test *self) 100 { 101 /* test: {skb->data[0], vlan_push} x 68 + {skb->data[0], vlan_pop} x 68 */ 102 #define PUSH_CNT 51 103 unsigned int len = BPF_MAXINSNS; 104 struct bpf_insn *insn = self->insns; 105 int i = 0, j, k = 0; 106 107 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 108 loop: 109 for (j = 0; j < PUSH_CNT; j++) { 110 insn[i++] = BPF_LD_ABS(BPF_B, 0); 111 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 112 i++; 113 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 114 insn[i++] = BPF_MOV64_IMM(BPF_REG_2, 1); 115 insn[i++] = BPF_MOV64_IMM(BPF_REG_3, 2); 116 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 117 BPF_FUNC_skb_vlan_push), 118 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 119 i++; 120 } 121 122 for (j = 0; j < PUSH_CNT; j++) { 123 insn[i++] = BPF_LD_ABS(BPF_B, 0); 124 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x34, len - i - 2); 125 i++; 126 insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_6); 127 insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 128 BPF_FUNC_skb_vlan_pop), 129 insn[i] = BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, len - i - 2); 130 i++; 131 } 132 if (++k < 5) 133 goto loop; 134 135 for (; i < len - 1; i++) 136 insn[i] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 0xbef); 137 insn[len - 1] = BPF_EXIT_INSN(); 138 } 139 140 static void bpf_fill_jump_around_ld_abs(struct bpf_test *self) 141 { 142 struct bpf_insn *insn = self->insns; 143 unsigned int len = BPF_MAXINSNS; 144 int i = 0; 145 146 insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); 147 insn[i++] = BPF_LD_ABS(BPF_B, 0); 148 insn[i] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 10, len - i - 2); 149 i++; 150 while (i < len - 1) 151 insn[i++] = BPF_LD_ABS(BPF_B, 1); 152 insn[i] = BPF_EXIT_INSN(); 153 } 154 155 static struct bpf_test tests[] = { 156 { 157 "add+sub+mul", 158 .insns = { 159 BPF_MOV64_IMM(BPF_REG_1, 1), 160 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 161 BPF_MOV64_IMM(BPF_REG_2, 3), 162 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 163 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 164 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 165 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 166 BPF_EXIT_INSN(), 167 }, 168 .result = ACCEPT, 169 .retval = -3, 170 }, 171 { 172 "DIV32 by 0, zero check 1", 173 .insns = { 174 BPF_MOV32_IMM(BPF_REG_0, 42), 175 BPF_MOV32_IMM(BPF_REG_1, 0), 176 BPF_MOV32_IMM(BPF_REG_2, 1), 177 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 178 BPF_EXIT_INSN(), 179 }, 180 .result = ACCEPT, 181 .retval = 42, 182 }, 183 { 184 "DIV32 by 0, zero check 2", 185 .insns = { 186 BPF_MOV32_IMM(BPF_REG_0, 42), 187 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 188 BPF_MOV32_IMM(BPF_REG_2, 1), 189 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 190 BPF_EXIT_INSN(), 191 }, 192 .result = ACCEPT, 193 .retval = 42, 194 }, 195 { 196 "DIV64 by 0, zero check", 197 .insns = { 198 BPF_MOV32_IMM(BPF_REG_0, 42), 199 BPF_MOV32_IMM(BPF_REG_1, 0), 200 BPF_MOV32_IMM(BPF_REG_2, 1), 201 BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 202 BPF_EXIT_INSN(), 203 }, 204 .result = ACCEPT, 205 .retval = 42, 206 }, 207 { 208 "MOD32 by 0, zero check 1", 209 .insns = { 210 BPF_MOV32_IMM(BPF_REG_0, 42), 211 BPF_MOV32_IMM(BPF_REG_1, 0), 212 BPF_MOV32_IMM(BPF_REG_2, 1), 213 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 214 BPF_EXIT_INSN(), 215 }, 216 .result = ACCEPT, 217 .retval = 42, 218 }, 219 { 220 "MOD32 by 0, zero check 2", 221 .insns = { 222 BPF_MOV32_IMM(BPF_REG_0, 42), 223 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 224 BPF_MOV32_IMM(BPF_REG_2, 1), 225 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 226 BPF_EXIT_INSN(), 227 }, 228 .result = ACCEPT, 229 .retval = 42, 230 }, 231 { 232 "MOD64 by 0, zero check", 233 .insns = { 234 BPF_MOV32_IMM(BPF_REG_0, 42), 235 BPF_MOV32_IMM(BPF_REG_1, 0), 236 BPF_MOV32_IMM(BPF_REG_2, 1), 237 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 238 BPF_EXIT_INSN(), 239 }, 240 .result = ACCEPT, 241 .retval = 42, 242 }, 243 { 244 "DIV32 by 0, zero check ok, cls", 245 .insns = { 246 BPF_MOV32_IMM(BPF_REG_0, 42), 247 BPF_MOV32_IMM(BPF_REG_1, 2), 248 BPF_MOV32_IMM(BPF_REG_2, 16), 249 BPF_ALU32_REG(BPF_DIV, BPF_REG_2, BPF_REG_1), 250 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 251 BPF_EXIT_INSN(), 252 }, 253 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 254 .result = ACCEPT, 255 .retval = 8, 256 }, 257 { 258 "DIV32 by 0, zero check 1, cls", 259 .insns = { 260 BPF_MOV32_IMM(BPF_REG_1, 0), 261 BPF_MOV32_IMM(BPF_REG_0, 1), 262 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 263 BPF_EXIT_INSN(), 264 }, 265 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 266 .result = ACCEPT, 267 .retval = 0, 268 }, 269 { 270 "DIV32 by 0, zero check 2, cls", 271 .insns = { 272 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 273 BPF_MOV32_IMM(BPF_REG_0, 1), 274 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 275 BPF_EXIT_INSN(), 276 }, 277 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 278 .result = ACCEPT, 279 .retval = 0, 280 }, 281 { 282 "DIV64 by 0, zero check, cls", 283 .insns = { 284 BPF_MOV32_IMM(BPF_REG_1, 0), 285 BPF_MOV32_IMM(BPF_REG_0, 1), 286 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 287 BPF_EXIT_INSN(), 288 }, 289 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 290 .result = ACCEPT, 291 .retval = 0, 292 }, 293 { 294 "MOD32 by 0, zero check ok, cls", 295 .insns = { 296 BPF_MOV32_IMM(BPF_REG_0, 42), 297 BPF_MOV32_IMM(BPF_REG_1, 3), 298 BPF_MOV32_IMM(BPF_REG_2, 5), 299 BPF_ALU32_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 300 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 301 BPF_EXIT_INSN(), 302 }, 303 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 304 .result = ACCEPT, 305 .retval = 2, 306 }, 307 { 308 "MOD32 by 0, zero check 1, cls", 309 .insns = { 310 BPF_MOV32_IMM(BPF_REG_1, 0), 311 BPF_MOV32_IMM(BPF_REG_0, 1), 312 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 313 BPF_EXIT_INSN(), 314 }, 315 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 316 .result = ACCEPT, 317 .retval = 1, 318 }, 319 { 320 "MOD32 by 0, zero check 2, cls", 321 .insns = { 322 BPF_LD_IMM64(BPF_REG_1, 0xffffffff00000000LL), 323 BPF_MOV32_IMM(BPF_REG_0, 1), 324 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 325 BPF_EXIT_INSN(), 326 }, 327 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 328 .result = ACCEPT, 329 .retval = 1, 330 }, 331 { 332 "MOD64 by 0, zero check 1, cls", 333 .insns = { 334 BPF_MOV32_IMM(BPF_REG_1, 0), 335 BPF_MOV32_IMM(BPF_REG_0, 2), 336 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 337 BPF_EXIT_INSN(), 338 }, 339 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 340 .result = ACCEPT, 341 .retval = 2, 342 }, 343 { 344 "MOD64 by 0, zero check 2, cls", 345 .insns = { 346 BPF_MOV32_IMM(BPF_REG_1, 0), 347 BPF_MOV32_IMM(BPF_REG_0, -1), 348 BPF_ALU64_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 349 BPF_EXIT_INSN(), 350 }, 351 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 352 .result = ACCEPT, 353 .retval = -1, 354 }, 355 /* Just make sure that JITs used udiv/umod as otherwise we get 356 * an exception from INT_MIN/-1 overflow similarly as with div 357 * by zero. 358 */ 359 { 360 "DIV32 overflow, check 1", 361 .insns = { 362 BPF_MOV32_IMM(BPF_REG_1, -1), 363 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 364 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 365 BPF_EXIT_INSN(), 366 }, 367 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 368 .result = ACCEPT, 369 .retval = 0, 370 }, 371 { 372 "DIV32 overflow, check 2", 373 .insns = { 374 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 375 BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1), 376 BPF_EXIT_INSN(), 377 }, 378 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 379 .result = ACCEPT, 380 .retval = 0, 381 }, 382 { 383 "DIV64 overflow, check 1", 384 .insns = { 385 BPF_MOV64_IMM(BPF_REG_1, -1), 386 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 387 BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1), 388 BPF_EXIT_INSN(), 389 }, 390 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 391 .result = ACCEPT, 392 .retval = 0, 393 }, 394 { 395 "DIV64 overflow, check 2", 396 .insns = { 397 BPF_LD_IMM64(BPF_REG_0, LLONG_MIN), 398 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, -1), 399 BPF_EXIT_INSN(), 400 }, 401 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 402 .result = ACCEPT, 403 .retval = 0, 404 }, 405 { 406 "MOD32 overflow, check 1", 407 .insns = { 408 BPF_MOV32_IMM(BPF_REG_1, -1), 409 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 410 BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1), 411 BPF_EXIT_INSN(), 412 }, 413 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 414 .result = ACCEPT, 415 .retval = INT_MIN, 416 }, 417 { 418 "MOD32 overflow, check 2", 419 .insns = { 420 BPF_MOV32_IMM(BPF_REG_0, INT_MIN), 421 BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1), 422 BPF_EXIT_INSN(), 423 }, 424 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 425 .result = ACCEPT, 426 .retval = INT_MIN, 427 }, 428 { 429 "MOD64 overflow, check 1", 430 .insns = { 431 BPF_MOV64_IMM(BPF_REG_1, -1), 432 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 433 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 434 BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1), 435 BPF_MOV32_IMM(BPF_REG_0, 0), 436 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 437 BPF_MOV32_IMM(BPF_REG_0, 1), 438 BPF_EXIT_INSN(), 439 }, 440 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 441 .result = ACCEPT, 442 .retval = 1, 443 }, 444 { 445 "MOD64 overflow, check 2", 446 .insns = { 447 BPF_LD_IMM64(BPF_REG_2, LLONG_MIN), 448 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 449 BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1), 450 BPF_MOV32_IMM(BPF_REG_0, 0), 451 BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1), 452 BPF_MOV32_IMM(BPF_REG_0, 1), 453 BPF_EXIT_INSN(), 454 }, 455 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 456 .result = ACCEPT, 457 .retval = 1, 458 }, 459 { 460 "xor32 zero extend check", 461 .insns = { 462 BPF_MOV32_IMM(BPF_REG_2, -1), 463 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 464 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 465 BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 466 BPF_MOV32_IMM(BPF_REG_0, 2), 467 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 468 BPF_MOV32_IMM(BPF_REG_0, 1), 469 BPF_EXIT_INSN(), 470 }, 471 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 472 .result = ACCEPT, 473 .retval = 1, 474 }, 475 { 476 "empty prog", 477 .insns = { 478 }, 479 .errstr = "unknown opcode 00", 480 .result = REJECT, 481 }, 482 { 483 "only exit insn", 484 .insns = { 485 BPF_EXIT_INSN(), 486 }, 487 .errstr = "R0 !read_ok", 488 .result = REJECT, 489 }, 490 { 491 "unreachable", 492 .insns = { 493 BPF_EXIT_INSN(), 494 BPF_EXIT_INSN(), 495 }, 496 .errstr = "unreachable", 497 .result = REJECT, 498 }, 499 { 500 "unreachable2", 501 .insns = { 502 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 503 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 504 BPF_EXIT_INSN(), 505 }, 506 .errstr = "unreachable", 507 .result = REJECT, 508 }, 509 { 510 "out of range jump", 511 .insns = { 512 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 513 BPF_EXIT_INSN(), 514 }, 515 .errstr = "jump out of range", 516 .result = REJECT, 517 }, 518 { 519 "out of range jump2", 520 .insns = { 521 BPF_JMP_IMM(BPF_JA, 0, 0, -2), 522 BPF_EXIT_INSN(), 523 }, 524 .errstr = "jump out of range", 525 .result = REJECT, 526 }, 527 { 528 "test1 ld_imm64", 529 .insns = { 530 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 531 BPF_LD_IMM64(BPF_REG_0, 0), 532 BPF_LD_IMM64(BPF_REG_0, 0), 533 BPF_LD_IMM64(BPF_REG_0, 1), 534 BPF_LD_IMM64(BPF_REG_0, 1), 535 BPF_MOV64_IMM(BPF_REG_0, 2), 536 BPF_EXIT_INSN(), 537 }, 538 .errstr = "invalid BPF_LD_IMM insn", 539 .errstr_unpriv = "R1 pointer comparison", 540 .result = REJECT, 541 }, 542 { 543 "test2 ld_imm64", 544 .insns = { 545 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 546 BPF_LD_IMM64(BPF_REG_0, 0), 547 BPF_LD_IMM64(BPF_REG_0, 0), 548 BPF_LD_IMM64(BPF_REG_0, 1), 549 BPF_LD_IMM64(BPF_REG_0, 1), 550 BPF_EXIT_INSN(), 551 }, 552 .errstr = "invalid BPF_LD_IMM insn", 553 .errstr_unpriv = "R1 pointer comparison", 554 .result = REJECT, 555 }, 556 { 557 "test3 ld_imm64", 558 .insns = { 559 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 560 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 561 BPF_LD_IMM64(BPF_REG_0, 0), 562 BPF_LD_IMM64(BPF_REG_0, 0), 563 BPF_LD_IMM64(BPF_REG_0, 1), 564 BPF_LD_IMM64(BPF_REG_0, 1), 565 BPF_EXIT_INSN(), 566 }, 567 .errstr = "invalid bpf_ld_imm64 insn", 568 .result = REJECT, 569 }, 570 { 571 "test4 ld_imm64", 572 .insns = { 573 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 574 BPF_EXIT_INSN(), 575 }, 576 .errstr = "invalid bpf_ld_imm64 insn", 577 .result = REJECT, 578 }, 579 { 580 "test5 ld_imm64", 581 .insns = { 582 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 583 }, 584 .errstr = "invalid bpf_ld_imm64 insn", 585 .result = REJECT, 586 }, 587 { 588 "test6 ld_imm64", 589 .insns = { 590 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0), 591 BPF_RAW_INSN(0, 0, 0, 0, 0), 592 BPF_EXIT_INSN(), 593 }, 594 .result = ACCEPT, 595 }, 596 { 597 "test7 ld_imm64", 598 .insns = { 599 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 600 BPF_RAW_INSN(0, 0, 0, 0, 1), 601 BPF_EXIT_INSN(), 602 }, 603 .result = ACCEPT, 604 .retval = 1, 605 }, 606 { 607 "test8 ld_imm64", 608 .insns = { 609 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 1, 1), 610 BPF_RAW_INSN(0, 0, 0, 0, 1), 611 BPF_EXIT_INSN(), 612 }, 613 .errstr = "uses reserved fields", 614 .result = REJECT, 615 }, 616 { 617 "test9 ld_imm64", 618 .insns = { 619 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 620 BPF_RAW_INSN(0, 0, 0, 1, 1), 621 BPF_EXIT_INSN(), 622 }, 623 .errstr = "invalid bpf_ld_imm64 insn", 624 .result = REJECT, 625 }, 626 { 627 "test10 ld_imm64", 628 .insns = { 629 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 630 BPF_RAW_INSN(0, BPF_REG_1, 0, 0, 1), 631 BPF_EXIT_INSN(), 632 }, 633 .errstr = "invalid bpf_ld_imm64 insn", 634 .result = REJECT, 635 }, 636 { 637 "test11 ld_imm64", 638 .insns = { 639 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 1), 640 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 641 BPF_EXIT_INSN(), 642 }, 643 .errstr = "invalid bpf_ld_imm64 insn", 644 .result = REJECT, 645 }, 646 { 647 "test12 ld_imm64", 648 .insns = { 649 BPF_MOV64_IMM(BPF_REG_1, 0), 650 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 651 BPF_RAW_INSN(0, 0, 0, 0, 1), 652 BPF_EXIT_INSN(), 653 }, 654 .errstr = "not pointing to valid bpf_map", 655 .result = REJECT, 656 }, 657 { 658 "test13 ld_imm64", 659 .insns = { 660 BPF_MOV64_IMM(BPF_REG_1, 0), 661 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, BPF_REG_1, 0, 1), 662 BPF_RAW_INSN(0, 0, BPF_REG_1, 0, 1), 663 BPF_EXIT_INSN(), 664 }, 665 .errstr = "invalid bpf_ld_imm64 insn", 666 .result = REJECT, 667 }, 668 { 669 "arsh32 on imm", 670 .insns = { 671 BPF_MOV64_IMM(BPF_REG_0, 1), 672 BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 673 BPF_EXIT_INSN(), 674 }, 675 .result = REJECT, 676 .errstr = "unknown opcode c4", 677 }, 678 { 679 "arsh32 on reg", 680 .insns = { 681 BPF_MOV64_IMM(BPF_REG_0, 1), 682 BPF_MOV64_IMM(BPF_REG_1, 5), 683 BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 684 BPF_EXIT_INSN(), 685 }, 686 .result = REJECT, 687 .errstr = "unknown opcode cc", 688 }, 689 { 690 "arsh64 on imm", 691 .insns = { 692 BPF_MOV64_IMM(BPF_REG_0, 1), 693 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 694 BPF_EXIT_INSN(), 695 }, 696 .result = ACCEPT, 697 }, 698 { 699 "arsh64 on reg", 700 .insns = { 701 BPF_MOV64_IMM(BPF_REG_0, 1), 702 BPF_MOV64_IMM(BPF_REG_1, 5), 703 BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 704 BPF_EXIT_INSN(), 705 }, 706 .result = ACCEPT, 707 }, 708 { 709 "no bpf_exit", 710 .insns = { 711 BPF_ALU64_REG(BPF_MOV, BPF_REG_0, BPF_REG_2), 712 }, 713 .errstr = "not an exit", 714 .result = REJECT, 715 }, 716 { 717 "loop (back-edge)", 718 .insns = { 719 BPF_JMP_IMM(BPF_JA, 0, 0, -1), 720 BPF_EXIT_INSN(), 721 }, 722 .errstr = "back-edge", 723 .result = REJECT, 724 }, 725 { 726 "loop2 (back-edge)", 727 .insns = { 728 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 730 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 731 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 732 BPF_EXIT_INSN(), 733 }, 734 .errstr = "back-edge", 735 .result = REJECT, 736 }, 737 { 738 "conditional loop", 739 .insns = { 740 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 741 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 742 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 743 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 744 BPF_EXIT_INSN(), 745 }, 746 .errstr = "back-edge", 747 .result = REJECT, 748 }, 749 { 750 "read uninitialized register", 751 .insns = { 752 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 753 BPF_EXIT_INSN(), 754 }, 755 .errstr = "R2 !read_ok", 756 .result = REJECT, 757 }, 758 { 759 "read invalid register", 760 .insns = { 761 BPF_MOV64_REG(BPF_REG_0, -1), 762 BPF_EXIT_INSN(), 763 }, 764 .errstr = "R15 is invalid", 765 .result = REJECT, 766 }, 767 { 768 "program doesn't init R0 before exit", 769 .insns = { 770 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 771 BPF_EXIT_INSN(), 772 }, 773 .errstr = "R0 !read_ok", 774 .result = REJECT, 775 }, 776 { 777 "program doesn't init R0 before exit in all branches", 778 .insns = { 779 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 780 BPF_MOV64_IMM(BPF_REG_0, 1), 781 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 782 BPF_EXIT_INSN(), 783 }, 784 .errstr = "R0 !read_ok", 785 .errstr_unpriv = "R1 pointer comparison", 786 .result = REJECT, 787 }, 788 { 789 "stack out of bounds", 790 .insns = { 791 BPF_ST_MEM(BPF_DW, BPF_REG_10, 8, 0), 792 BPF_EXIT_INSN(), 793 }, 794 .errstr = "invalid stack", 795 .result = REJECT, 796 }, 797 { 798 "invalid call insn1", 799 .insns = { 800 BPF_RAW_INSN(BPF_JMP | BPF_CALL | BPF_X, 0, 0, 0, 0), 801 BPF_EXIT_INSN(), 802 }, 803 .errstr = "unknown opcode 8d", 804 .result = REJECT, 805 }, 806 { 807 "invalid call insn2", 808 .insns = { 809 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 1, 0), 810 BPF_EXIT_INSN(), 811 }, 812 .errstr = "BPF_CALL uses reserved", 813 .result = REJECT, 814 }, 815 { 816 "invalid function call", 817 .insns = { 818 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1234567), 819 BPF_EXIT_INSN(), 820 }, 821 .errstr = "invalid func unknown#1234567", 822 .result = REJECT, 823 }, 824 { 825 "uninitialized stack1", 826 .insns = { 827 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 828 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 829 BPF_LD_MAP_FD(BPF_REG_1, 0), 830 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 831 BPF_FUNC_map_lookup_elem), 832 BPF_EXIT_INSN(), 833 }, 834 .fixup_map1 = { 2 }, 835 .errstr = "invalid indirect read from stack", 836 .result = REJECT, 837 }, 838 { 839 "uninitialized stack2", 840 .insns = { 841 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 842 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -8), 843 BPF_EXIT_INSN(), 844 }, 845 .errstr = "invalid read from stack", 846 .result = REJECT, 847 }, 848 { 849 "invalid fp arithmetic", 850 /* If this gets ever changed, make sure JITs can deal with it. */ 851 .insns = { 852 BPF_MOV64_IMM(BPF_REG_0, 0), 853 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 854 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 8), 855 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 856 BPF_EXIT_INSN(), 857 }, 858 .errstr = "R1 subtraction from stack pointer", 859 .result = REJECT, 860 }, 861 { 862 "non-invalid fp arithmetic", 863 .insns = { 864 BPF_MOV64_IMM(BPF_REG_0, 0), 865 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 866 BPF_EXIT_INSN(), 867 }, 868 .result = ACCEPT, 869 }, 870 { 871 "invalid argument register", 872 .insns = { 873 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 874 BPF_FUNC_get_cgroup_classid), 875 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 876 BPF_FUNC_get_cgroup_classid), 877 BPF_EXIT_INSN(), 878 }, 879 .errstr = "R1 !read_ok", 880 .result = REJECT, 881 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 882 }, 883 { 884 "non-invalid argument register", 885 .insns = { 886 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 887 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 888 BPF_FUNC_get_cgroup_classid), 889 BPF_ALU64_REG(BPF_MOV, BPF_REG_1, BPF_REG_6), 890 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 891 BPF_FUNC_get_cgroup_classid), 892 BPF_EXIT_INSN(), 893 }, 894 .result = ACCEPT, 895 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 896 }, 897 { 898 "check valid spill/fill", 899 .insns = { 900 /* spill R1(ctx) into stack */ 901 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 902 /* fill it back into R2 */ 903 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 904 /* should be able to access R0 = *(R2 + 8) */ 905 /* BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 8), */ 906 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 907 BPF_EXIT_INSN(), 908 }, 909 .errstr_unpriv = "R0 leaks addr", 910 .result = ACCEPT, 911 .result_unpriv = REJECT, 912 .retval = POINTER_VALUE, 913 }, 914 { 915 "check valid spill/fill, skb mark", 916 .insns = { 917 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 918 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 919 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 920 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 921 offsetof(struct __sk_buff, mark)), 922 BPF_EXIT_INSN(), 923 }, 924 .result = ACCEPT, 925 .result_unpriv = ACCEPT, 926 }, 927 { 928 "check corrupted spill/fill", 929 .insns = { 930 /* spill R1(ctx) into stack */ 931 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 932 /* mess up with R1 pointer on stack */ 933 BPF_ST_MEM(BPF_B, BPF_REG_10, -7, 0x23), 934 /* fill back into R0 should fail */ 935 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 936 BPF_EXIT_INSN(), 937 }, 938 .errstr_unpriv = "attempt to corrupt spilled", 939 .errstr = "corrupted spill", 940 .result = REJECT, 941 }, 942 { 943 "invalid src register in STX", 944 .insns = { 945 BPF_STX_MEM(BPF_B, BPF_REG_10, -1, -1), 946 BPF_EXIT_INSN(), 947 }, 948 .errstr = "R15 is invalid", 949 .result = REJECT, 950 }, 951 { 952 "invalid dst register in STX", 953 .insns = { 954 BPF_STX_MEM(BPF_B, 14, BPF_REG_10, -1), 955 BPF_EXIT_INSN(), 956 }, 957 .errstr = "R14 is invalid", 958 .result = REJECT, 959 }, 960 { 961 "invalid dst register in ST", 962 .insns = { 963 BPF_ST_MEM(BPF_B, 14, -1, -1), 964 BPF_EXIT_INSN(), 965 }, 966 .errstr = "R14 is invalid", 967 .result = REJECT, 968 }, 969 { 970 "invalid src register in LDX", 971 .insns = { 972 BPF_LDX_MEM(BPF_B, BPF_REG_0, 12, 0), 973 BPF_EXIT_INSN(), 974 }, 975 .errstr = "R12 is invalid", 976 .result = REJECT, 977 }, 978 { 979 "invalid dst register in LDX", 980 .insns = { 981 BPF_LDX_MEM(BPF_B, 11, BPF_REG_1, 0), 982 BPF_EXIT_INSN(), 983 }, 984 .errstr = "R11 is invalid", 985 .result = REJECT, 986 }, 987 { 988 "junk insn", 989 .insns = { 990 BPF_RAW_INSN(0, 0, 0, 0, 0), 991 BPF_EXIT_INSN(), 992 }, 993 .errstr = "unknown opcode 00", 994 .result = REJECT, 995 }, 996 { 997 "junk insn2", 998 .insns = { 999 BPF_RAW_INSN(1, 0, 0, 0, 0), 1000 BPF_EXIT_INSN(), 1001 }, 1002 .errstr = "BPF_LDX uses reserved fields", 1003 .result = REJECT, 1004 }, 1005 { 1006 "junk insn3", 1007 .insns = { 1008 BPF_RAW_INSN(-1, 0, 0, 0, 0), 1009 BPF_EXIT_INSN(), 1010 }, 1011 .errstr = "unknown opcode ff", 1012 .result = REJECT, 1013 }, 1014 { 1015 "junk insn4", 1016 .insns = { 1017 BPF_RAW_INSN(-1, -1, -1, -1, -1), 1018 BPF_EXIT_INSN(), 1019 }, 1020 .errstr = "unknown opcode ff", 1021 .result = REJECT, 1022 }, 1023 { 1024 "junk insn5", 1025 .insns = { 1026 BPF_RAW_INSN(0x7f, -1, -1, -1, -1), 1027 BPF_EXIT_INSN(), 1028 }, 1029 .errstr = "BPF_ALU uses reserved fields", 1030 .result = REJECT, 1031 }, 1032 { 1033 "misaligned read from stack", 1034 .insns = { 1035 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1036 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, -4), 1037 BPF_EXIT_INSN(), 1038 }, 1039 .errstr = "misaligned stack access", 1040 .result = REJECT, 1041 }, 1042 { 1043 "invalid map_fd for function call", 1044 .insns = { 1045 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1046 BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_10), 1047 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1048 BPF_LD_MAP_FD(BPF_REG_1, 0), 1049 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1050 BPF_FUNC_map_delete_elem), 1051 BPF_EXIT_INSN(), 1052 }, 1053 .errstr = "fd 0 is not pointing to valid bpf_map", 1054 .result = REJECT, 1055 }, 1056 { 1057 "don't check return value before access", 1058 .insns = { 1059 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1060 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1061 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1062 BPF_LD_MAP_FD(BPF_REG_1, 0), 1063 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1064 BPF_FUNC_map_lookup_elem), 1065 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1066 BPF_EXIT_INSN(), 1067 }, 1068 .fixup_map1 = { 3 }, 1069 .errstr = "R0 invalid mem access 'map_value_or_null'", 1070 .result = REJECT, 1071 }, 1072 { 1073 "access memory with incorrect alignment", 1074 .insns = { 1075 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1076 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1077 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1078 BPF_LD_MAP_FD(BPF_REG_1, 0), 1079 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1080 BPF_FUNC_map_lookup_elem), 1081 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 1082 BPF_ST_MEM(BPF_DW, BPF_REG_0, 4, 0), 1083 BPF_EXIT_INSN(), 1084 }, 1085 .fixup_map1 = { 3 }, 1086 .errstr = "misaligned value access", 1087 .result = REJECT, 1088 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1089 }, 1090 { 1091 "sometimes access memory with incorrect alignment", 1092 .insns = { 1093 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1094 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1095 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1096 BPF_LD_MAP_FD(BPF_REG_1, 0), 1097 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1098 BPF_FUNC_map_lookup_elem), 1099 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 1100 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 1101 BPF_EXIT_INSN(), 1102 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1), 1103 BPF_EXIT_INSN(), 1104 }, 1105 .fixup_map1 = { 3 }, 1106 .errstr = "R0 invalid mem access", 1107 .errstr_unpriv = "R0 leaks addr", 1108 .result = REJECT, 1109 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1110 }, 1111 { 1112 "jump test 1", 1113 .insns = { 1114 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1115 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -8), 1116 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 1117 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1118 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1119 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 1), 1120 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 1), 1121 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 2), 1122 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 1), 1123 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 3), 1124 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 1), 1125 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 4), 1126 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1127 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 5), 1128 BPF_MOV64_IMM(BPF_REG_0, 0), 1129 BPF_EXIT_INSN(), 1130 }, 1131 .errstr_unpriv = "R1 pointer comparison", 1132 .result_unpriv = REJECT, 1133 .result = ACCEPT, 1134 }, 1135 { 1136 "jump test 2", 1137 .insns = { 1138 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1139 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 1140 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1141 BPF_JMP_IMM(BPF_JA, 0, 0, 14), 1142 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2), 1143 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1144 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1145 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 2), 1146 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1147 BPF_JMP_IMM(BPF_JA, 0, 0, 8), 1148 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2), 1149 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1150 BPF_JMP_IMM(BPF_JA, 0, 0, 5), 1151 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 2), 1152 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1153 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1154 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 1), 1155 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1156 BPF_MOV64_IMM(BPF_REG_0, 0), 1157 BPF_EXIT_INSN(), 1158 }, 1159 .errstr_unpriv = "R1 pointer comparison", 1160 .result_unpriv = REJECT, 1161 .result = ACCEPT, 1162 }, 1163 { 1164 "jump test 3", 1165 .insns = { 1166 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1167 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 1168 BPF_ST_MEM(BPF_DW, BPF_REG_2, -8, 0), 1169 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1170 BPF_JMP_IMM(BPF_JA, 0, 0, 19), 1171 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 3), 1172 BPF_ST_MEM(BPF_DW, BPF_REG_2, -16, 0), 1173 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 1174 BPF_JMP_IMM(BPF_JA, 0, 0, 15), 1175 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 2, 3), 1176 BPF_ST_MEM(BPF_DW, BPF_REG_2, -32, 0), 1177 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32), 1178 BPF_JMP_IMM(BPF_JA, 0, 0, 11), 1179 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 3), 1180 BPF_ST_MEM(BPF_DW, BPF_REG_2, -40, 0), 1181 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -40), 1182 BPF_JMP_IMM(BPF_JA, 0, 0, 7), 1183 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 4, 3), 1184 BPF_ST_MEM(BPF_DW, BPF_REG_2, -48, 0), 1185 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -48), 1186 BPF_JMP_IMM(BPF_JA, 0, 0, 3), 1187 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 5, 0), 1188 BPF_ST_MEM(BPF_DW, BPF_REG_2, -56, 0), 1189 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -56), 1190 BPF_LD_MAP_FD(BPF_REG_1, 0), 1191 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1192 BPF_FUNC_map_delete_elem), 1193 BPF_EXIT_INSN(), 1194 }, 1195 .fixup_map1 = { 24 }, 1196 .errstr_unpriv = "R1 pointer comparison", 1197 .result_unpriv = REJECT, 1198 .result = ACCEPT, 1199 .retval = -ENOENT, 1200 }, 1201 { 1202 "jump test 4", 1203 .insns = { 1204 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1205 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1206 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1207 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1208 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1209 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1210 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1211 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1212 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1213 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1214 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1215 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1216 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1217 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1218 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1219 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1220 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1221 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1222 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1223 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1224 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1225 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1226 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1227 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1229 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1230 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1231 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1232 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1233 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1234 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1235 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1236 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 1), 1237 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 2), 1238 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 3), 1239 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 4), 1240 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1241 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1242 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1243 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 1244 BPF_MOV64_IMM(BPF_REG_0, 0), 1245 BPF_EXIT_INSN(), 1246 }, 1247 .errstr_unpriv = "R1 pointer comparison", 1248 .result_unpriv = REJECT, 1249 .result = ACCEPT, 1250 }, 1251 { 1252 "jump test 5", 1253 .insns = { 1254 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1255 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 1256 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1257 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1258 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1259 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1260 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1261 BPF_MOV64_IMM(BPF_REG_0, 0), 1262 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1263 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1264 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1265 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1266 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1267 BPF_MOV64_IMM(BPF_REG_0, 0), 1268 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1269 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1270 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1271 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1272 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1273 BPF_MOV64_IMM(BPF_REG_0, 0), 1274 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1275 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1276 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1277 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1278 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1279 BPF_MOV64_IMM(BPF_REG_0, 0), 1280 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1281 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_3, -8), 1282 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 1283 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_2, -8), 1284 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 1285 BPF_MOV64_IMM(BPF_REG_0, 0), 1286 BPF_EXIT_INSN(), 1287 }, 1288 .errstr_unpriv = "R1 pointer comparison", 1289 .result_unpriv = REJECT, 1290 .result = ACCEPT, 1291 }, 1292 { 1293 "access skb fields ok", 1294 .insns = { 1295 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1296 offsetof(struct __sk_buff, len)), 1297 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1298 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1299 offsetof(struct __sk_buff, mark)), 1300 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1301 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1302 offsetof(struct __sk_buff, pkt_type)), 1303 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 1304 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1305 offsetof(struct __sk_buff, queue_mapping)), 1306 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1307 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1308 offsetof(struct __sk_buff, protocol)), 1309 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1310 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1311 offsetof(struct __sk_buff, vlan_present)), 1312 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1313 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1314 offsetof(struct __sk_buff, vlan_tci)), 1315 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1316 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1317 offsetof(struct __sk_buff, napi_id)), 1318 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 0), 1319 BPF_EXIT_INSN(), 1320 }, 1321 .result = ACCEPT, 1322 }, 1323 { 1324 "access skb fields bad1", 1325 .insns = { 1326 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -4), 1327 BPF_EXIT_INSN(), 1328 }, 1329 .errstr = "invalid bpf_context access", 1330 .result = REJECT, 1331 }, 1332 { 1333 "access skb fields bad2", 1334 .insns = { 1335 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 9), 1336 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1337 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1339 BPF_LD_MAP_FD(BPF_REG_1, 0), 1340 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1341 BPF_FUNC_map_lookup_elem), 1342 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1343 BPF_EXIT_INSN(), 1344 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1345 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1346 offsetof(struct __sk_buff, pkt_type)), 1347 BPF_EXIT_INSN(), 1348 }, 1349 .fixup_map1 = { 4 }, 1350 .errstr = "different pointers", 1351 .errstr_unpriv = "R1 pointer comparison", 1352 .result = REJECT, 1353 }, 1354 { 1355 "access skb fields bad3", 1356 .insns = { 1357 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 2), 1358 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1359 offsetof(struct __sk_buff, pkt_type)), 1360 BPF_EXIT_INSN(), 1361 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1362 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1363 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1364 BPF_LD_MAP_FD(BPF_REG_1, 0), 1365 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1366 BPF_FUNC_map_lookup_elem), 1367 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1368 BPF_EXIT_INSN(), 1369 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1370 BPF_JMP_IMM(BPF_JA, 0, 0, -12), 1371 }, 1372 .fixup_map1 = { 6 }, 1373 .errstr = "different pointers", 1374 .errstr_unpriv = "R1 pointer comparison", 1375 .result = REJECT, 1376 }, 1377 { 1378 "access skb fields bad4", 1379 .insns = { 1380 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0, 3), 1381 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1382 offsetof(struct __sk_buff, len)), 1383 BPF_MOV64_IMM(BPF_REG_0, 0), 1384 BPF_EXIT_INSN(), 1385 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1386 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 1387 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 1388 BPF_LD_MAP_FD(BPF_REG_1, 0), 1389 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 1390 BPF_FUNC_map_lookup_elem), 1391 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1392 BPF_EXIT_INSN(), 1393 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 1394 BPF_JMP_IMM(BPF_JA, 0, 0, -13), 1395 }, 1396 .fixup_map1 = { 7 }, 1397 .errstr = "different pointers", 1398 .errstr_unpriv = "R1 pointer comparison", 1399 .result = REJECT, 1400 }, 1401 { 1402 "invalid access __sk_buff family", 1403 .insns = { 1404 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1405 offsetof(struct __sk_buff, family)), 1406 BPF_EXIT_INSN(), 1407 }, 1408 .errstr = "invalid bpf_context access", 1409 .result = REJECT, 1410 }, 1411 { 1412 "invalid access __sk_buff remote_ip4", 1413 .insns = { 1414 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1415 offsetof(struct __sk_buff, remote_ip4)), 1416 BPF_EXIT_INSN(), 1417 }, 1418 .errstr = "invalid bpf_context access", 1419 .result = REJECT, 1420 }, 1421 { 1422 "invalid access __sk_buff local_ip4", 1423 .insns = { 1424 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1425 offsetof(struct __sk_buff, local_ip4)), 1426 BPF_EXIT_INSN(), 1427 }, 1428 .errstr = "invalid bpf_context access", 1429 .result = REJECT, 1430 }, 1431 { 1432 "invalid access __sk_buff remote_ip6", 1433 .insns = { 1434 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1435 offsetof(struct __sk_buff, remote_ip6)), 1436 BPF_EXIT_INSN(), 1437 }, 1438 .errstr = "invalid bpf_context access", 1439 .result = REJECT, 1440 }, 1441 { 1442 "invalid access __sk_buff local_ip6", 1443 .insns = { 1444 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1445 offsetof(struct __sk_buff, local_ip6)), 1446 BPF_EXIT_INSN(), 1447 }, 1448 .errstr = "invalid bpf_context access", 1449 .result = REJECT, 1450 }, 1451 { 1452 "invalid access __sk_buff remote_port", 1453 .insns = { 1454 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1455 offsetof(struct __sk_buff, remote_port)), 1456 BPF_EXIT_INSN(), 1457 }, 1458 .errstr = "invalid bpf_context access", 1459 .result = REJECT, 1460 }, 1461 { 1462 "invalid access __sk_buff remote_port", 1463 .insns = { 1464 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1465 offsetof(struct __sk_buff, local_port)), 1466 BPF_EXIT_INSN(), 1467 }, 1468 .errstr = "invalid bpf_context access", 1469 .result = REJECT, 1470 }, 1471 { 1472 "valid access __sk_buff family", 1473 .insns = { 1474 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1475 offsetof(struct __sk_buff, family)), 1476 BPF_EXIT_INSN(), 1477 }, 1478 .result = ACCEPT, 1479 .prog_type = BPF_PROG_TYPE_SK_SKB, 1480 }, 1481 { 1482 "valid access __sk_buff remote_ip4", 1483 .insns = { 1484 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1485 offsetof(struct __sk_buff, remote_ip4)), 1486 BPF_EXIT_INSN(), 1487 }, 1488 .result = ACCEPT, 1489 .prog_type = BPF_PROG_TYPE_SK_SKB, 1490 }, 1491 { 1492 "valid access __sk_buff local_ip4", 1493 .insns = { 1494 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1495 offsetof(struct __sk_buff, local_ip4)), 1496 BPF_EXIT_INSN(), 1497 }, 1498 .result = ACCEPT, 1499 .prog_type = BPF_PROG_TYPE_SK_SKB, 1500 }, 1501 { 1502 "valid access __sk_buff remote_ip6", 1503 .insns = { 1504 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1505 offsetof(struct __sk_buff, remote_ip6[0])), 1506 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1507 offsetof(struct __sk_buff, remote_ip6[1])), 1508 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1509 offsetof(struct __sk_buff, remote_ip6[2])), 1510 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1511 offsetof(struct __sk_buff, remote_ip6[3])), 1512 BPF_EXIT_INSN(), 1513 }, 1514 .result = ACCEPT, 1515 .prog_type = BPF_PROG_TYPE_SK_SKB, 1516 }, 1517 { 1518 "valid access __sk_buff local_ip6", 1519 .insns = { 1520 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1521 offsetof(struct __sk_buff, local_ip6[0])), 1522 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1523 offsetof(struct __sk_buff, local_ip6[1])), 1524 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1525 offsetof(struct __sk_buff, local_ip6[2])), 1526 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1527 offsetof(struct __sk_buff, local_ip6[3])), 1528 BPF_EXIT_INSN(), 1529 }, 1530 .result = ACCEPT, 1531 .prog_type = BPF_PROG_TYPE_SK_SKB, 1532 }, 1533 { 1534 "valid access __sk_buff remote_port", 1535 .insns = { 1536 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1537 offsetof(struct __sk_buff, remote_port)), 1538 BPF_EXIT_INSN(), 1539 }, 1540 .result = ACCEPT, 1541 .prog_type = BPF_PROG_TYPE_SK_SKB, 1542 }, 1543 { 1544 "valid access __sk_buff remote_port", 1545 .insns = { 1546 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1547 offsetof(struct __sk_buff, local_port)), 1548 BPF_EXIT_INSN(), 1549 }, 1550 .result = ACCEPT, 1551 .prog_type = BPF_PROG_TYPE_SK_SKB, 1552 }, 1553 { 1554 "invalid access of tc_classid for SK_SKB", 1555 .insns = { 1556 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1557 offsetof(struct __sk_buff, tc_classid)), 1558 BPF_EXIT_INSN(), 1559 }, 1560 .result = REJECT, 1561 .prog_type = BPF_PROG_TYPE_SK_SKB, 1562 .errstr = "invalid bpf_context access", 1563 }, 1564 { 1565 "invalid access of skb->mark for SK_SKB", 1566 .insns = { 1567 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1568 offsetof(struct __sk_buff, mark)), 1569 BPF_EXIT_INSN(), 1570 }, 1571 .result = REJECT, 1572 .prog_type = BPF_PROG_TYPE_SK_SKB, 1573 .errstr = "invalid bpf_context access", 1574 }, 1575 { 1576 "check skb->mark is not writeable by SK_SKB", 1577 .insns = { 1578 BPF_MOV64_IMM(BPF_REG_0, 0), 1579 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1580 offsetof(struct __sk_buff, mark)), 1581 BPF_EXIT_INSN(), 1582 }, 1583 .result = REJECT, 1584 .prog_type = BPF_PROG_TYPE_SK_SKB, 1585 .errstr = "invalid bpf_context access", 1586 }, 1587 { 1588 "check skb->tc_index is writeable by SK_SKB", 1589 .insns = { 1590 BPF_MOV64_IMM(BPF_REG_0, 0), 1591 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1592 offsetof(struct __sk_buff, tc_index)), 1593 BPF_EXIT_INSN(), 1594 }, 1595 .result = ACCEPT, 1596 .prog_type = BPF_PROG_TYPE_SK_SKB, 1597 }, 1598 { 1599 "check skb->priority is writeable by SK_SKB", 1600 .insns = { 1601 BPF_MOV64_IMM(BPF_REG_0, 0), 1602 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 1603 offsetof(struct __sk_buff, priority)), 1604 BPF_EXIT_INSN(), 1605 }, 1606 .result = ACCEPT, 1607 .prog_type = BPF_PROG_TYPE_SK_SKB, 1608 }, 1609 { 1610 "direct packet read for SK_SKB", 1611 .insns = { 1612 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1613 offsetof(struct __sk_buff, data)), 1614 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1615 offsetof(struct __sk_buff, data_end)), 1616 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1617 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1618 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1619 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1620 BPF_MOV64_IMM(BPF_REG_0, 0), 1621 BPF_EXIT_INSN(), 1622 }, 1623 .result = ACCEPT, 1624 .prog_type = BPF_PROG_TYPE_SK_SKB, 1625 }, 1626 { 1627 "direct packet write for SK_SKB", 1628 .insns = { 1629 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1630 offsetof(struct __sk_buff, data)), 1631 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1632 offsetof(struct __sk_buff, data_end)), 1633 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1634 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1635 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1636 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1637 BPF_MOV64_IMM(BPF_REG_0, 0), 1638 BPF_EXIT_INSN(), 1639 }, 1640 .result = ACCEPT, 1641 .prog_type = BPF_PROG_TYPE_SK_SKB, 1642 }, 1643 { 1644 "overlapping checks for direct packet access SK_SKB", 1645 .insns = { 1646 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 1647 offsetof(struct __sk_buff, data)), 1648 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 1649 offsetof(struct __sk_buff, data_end)), 1650 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1651 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1652 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1653 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1654 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1655 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1656 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1657 BPF_MOV64_IMM(BPF_REG_0, 0), 1658 BPF_EXIT_INSN(), 1659 }, 1660 .result = ACCEPT, 1661 .prog_type = BPF_PROG_TYPE_SK_SKB, 1662 }, 1663 { 1664 "direct packet read for SK_MSG", 1665 .insns = { 1666 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1667 offsetof(struct sk_msg_md, data)), 1668 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1669 offsetof(struct sk_msg_md, data_end)), 1670 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1671 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1672 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1673 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 1674 BPF_MOV64_IMM(BPF_REG_0, 0), 1675 BPF_EXIT_INSN(), 1676 }, 1677 .result = ACCEPT, 1678 .prog_type = BPF_PROG_TYPE_SK_MSG, 1679 }, 1680 { 1681 "direct packet write for SK_MSG", 1682 .insns = { 1683 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1684 offsetof(struct sk_msg_md, data)), 1685 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1686 offsetof(struct sk_msg_md, data_end)), 1687 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1688 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1689 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 1690 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 1691 BPF_MOV64_IMM(BPF_REG_0, 0), 1692 BPF_EXIT_INSN(), 1693 }, 1694 .result = ACCEPT, 1695 .prog_type = BPF_PROG_TYPE_SK_MSG, 1696 }, 1697 { 1698 "overlapping checks for direct packet access SK_MSG", 1699 .insns = { 1700 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, 1701 offsetof(struct sk_msg_md, data)), 1702 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 1703 offsetof(struct sk_msg_md, data_end)), 1704 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1705 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 1706 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 1707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 1708 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 1709 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 1710 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 1711 BPF_MOV64_IMM(BPF_REG_0, 0), 1712 BPF_EXIT_INSN(), 1713 }, 1714 .result = ACCEPT, 1715 .prog_type = BPF_PROG_TYPE_SK_MSG, 1716 }, 1717 { 1718 "check skb->mark is not writeable by sockets", 1719 .insns = { 1720 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1721 offsetof(struct __sk_buff, mark)), 1722 BPF_EXIT_INSN(), 1723 }, 1724 .errstr = "invalid bpf_context access", 1725 .errstr_unpriv = "R1 leaks addr", 1726 .result = REJECT, 1727 }, 1728 { 1729 "check skb->tc_index is not writeable by sockets", 1730 .insns = { 1731 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 1732 offsetof(struct __sk_buff, tc_index)), 1733 BPF_EXIT_INSN(), 1734 }, 1735 .errstr = "invalid bpf_context access", 1736 .errstr_unpriv = "R1 leaks addr", 1737 .result = REJECT, 1738 }, 1739 { 1740 "check cb access: byte", 1741 .insns = { 1742 BPF_MOV64_IMM(BPF_REG_0, 0), 1743 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1744 offsetof(struct __sk_buff, cb[0])), 1745 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1746 offsetof(struct __sk_buff, cb[0]) + 1), 1747 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1748 offsetof(struct __sk_buff, cb[0]) + 2), 1749 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1750 offsetof(struct __sk_buff, cb[0]) + 3), 1751 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1752 offsetof(struct __sk_buff, cb[1])), 1753 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1754 offsetof(struct __sk_buff, cb[1]) + 1), 1755 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1756 offsetof(struct __sk_buff, cb[1]) + 2), 1757 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1758 offsetof(struct __sk_buff, cb[1]) + 3), 1759 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1760 offsetof(struct __sk_buff, cb[2])), 1761 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1762 offsetof(struct __sk_buff, cb[2]) + 1), 1763 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1764 offsetof(struct __sk_buff, cb[2]) + 2), 1765 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1766 offsetof(struct __sk_buff, cb[2]) + 3), 1767 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1768 offsetof(struct __sk_buff, cb[3])), 1769 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1770 offsetof(struct __sk_buff, cb[3]) + 1), 1771 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1772 offsetof(struct __sk_buff, cb[3]) + 2), 1773 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1774 offsetof(struct __sk_buff, cb[3]) + 3), 1775 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1776 offsetof(struct __sk_buff, cb[4])), 1777 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1778 offsetof(struct __sk_buff, cb[4]) + 1), 1779 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1780 offsetof(struct __sk_buff, cb[4]) + 2), 1781 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1782 offsetof(struct __sk_buff, cb[4]) + 3), 1783 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1784 offsetof(struct __sk_buff, cb[0])), 1785 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1786 offsetof(struct __sk_buff, cb[0]) + 1), 1787 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1788 offsetof(struct __sk_buff, cb[0]) + 2), 1789 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1790 offsetof(struct __sk_buff, cb[0]) + 3), 1791 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1792 offsetof(struct __sk_buff, cb[1])), 1793 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1794 offsetof(struct __sk_buff, cb[1]) + 1), 1795 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1796 offsetof(struct __sk_buff, cb[1]) + 2), 1797 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1798 offsetof(struct __sk_buff, cb[1]) + 3), 1799 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1800 offsetof(struct __sk_buff, cb[2])), 1801 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1802 offsetof(struct __sk_buff, cb[2]) + 1), 1803 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1804 offsetof(struct __sk_buff, cb[2]) + 2), 1805 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1806 offsetof(struct __sk_buff, cb[2]) + 3), 1807 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1808 offsetof(struct __sk_buff, cb[3])), 1809 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1810 offsetof(struct __sk_buff, cb[3]) + 1), 1811 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1812 offsetof(struct __sk_buff, cb[3]) + 2), 1813 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1814 offsetof(struct __sk_buff, cb[3]) + 3), 1815 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1816 offsetof(struct __sk_buff, cb[4])), 1817 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1818 offsetof(struct __sk_buff, cb[4]) + 1), 1819 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1820 offsetof(struct __sk_buff, cb[4]) + 2), 1821 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1822 offsetof(struct __sk_buff, cb[4]) + 3), 1823 BPF_EXIT_INSN(), 1824 }, 1825 .result = ACCEPT, 1826 }, 1827 { 1828 "__sk_buff->hash, offset 0, byte store not permitted", 1829 .insns = { 1830 BPF_MOV64_IMM(BPF_REG_0, 0), 1831 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1832 offsetof(struct __sk_buff, hash)), 1833 BPF_EXIT_INSN(), 1834 }, 1835 .errstr = "invalid bpf_context access", 1836 .result = REJECT, 1837 }, 1838 { 1839 "__sk_buff->tc_index, offset 3, byte store not permitted", 1840 .insns = { 1841 BPF_MOV64_IMM(BPF_REG_0, 0), 1842 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1843 offsetof(struct __sk_buff, tc_index) + 3), 1844 BPF_EXIT_INSN(), 1845 }, 1846 .errstr = "invalid bpf_context access", 1847 .result = REJECT, 1848 }, 1849 { 1850 "check skb->hash byte load permitted", 1851 .insns = { 1852 BPF_MOV64_IMM(BPF_REG_0, 0), 1853 #if __BYTE_ORDER == __LITTLE_ENDIAN 1854 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1855 offsetof(struct __sk_buff, hash)), 1856 #else 1857 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1858 offsetof(struct __sk_buff, hash) + 3), 1859 #endif 1860 BPF_EXIT_INSN(), 1861 }, 1862 .result = ACCEPT, 1863 }, 1864 { 1865 "check skb->hash byte load not permitted 1", 1866 .insns = { 1867 BPF_MOV64_IMM(BPF_REG_0, 0), 1868 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1869 offsetof(struct __sk_buff, hash) + 1), 1870 BPF_EXIT_INSN(), 1871 }, 1872 .errstr = "invalid bpf_context access", 1873 .result = REJECT, 1874 }, 1875 { 1876 "check skb->hash byte load not permitted 2", 1877 .insns = { 1878 BPF_MOV64_IMM(BPF_REG_0, 0), 1879 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1880 offsetof(struct __sk_buff, hash) + 2), 1881 BPF_EXIT_INSN(), 1882 }, 1883 .errstr = "invalid bpf_context access", 1884 .result = REJECT, 1885 }, 1886 { 1887 "check skb->hash byte load not permitted 3", 1888 .insns = { 1889 BPF_MOV64_IMM(BPF_REG_0, 0), 1890 #if __BYTE_ORDER == __LITTLE_ENDIAN 1891 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1892 offsetof(struct __sk_buff, hash) + 3), 1893 #else 1894 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1895 offsetof(struct __sk_buff, hash)), 1896 #endif 1897 BPF_EXIT_INSN(), 1898 }, 1899 .errstr = "invalid bpf_context access", 1900 .result = REJECT, 1901 }, 1902 { 1903 "check cb access: byte, wrong type", 1904 .insns = { 1905 BPF_MOV64_IMM(BPF_REG_0, 0), 1906 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 1907 offsetof(struct __sk_buff, cb[0])), 1908 BPF_EXIT_INSN(), 1909 }, 1910 .errstr = "invalid bpf_context access", 1911 .result = REJECT, 1912 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 1913 }, 1914 { 1915 "check cb access: half", 1916 .insns = { 1917 BPF_MOV64_IMM(BPF_REG_0, 0), 1918 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1919 offsetof(struct __sk_buff, cb[0])), 1920 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1921 offsetof(struct __sk_buff, cb[0]) + 2), 1922 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1923 offsetof(struct __sk_buff, cb[1])), 1924 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1925 offsetof(struct __sk_buff, cb[1]) + 2), 1926 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1927 offsetof(struct __sk_buff, cb[2])), 1928 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1929 offsetof(struct __sk_buff, cb[2]) + 2), 1930 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1931 offsetof(struct __sk_buff, cb[3])), 1932 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1933 offsetof(struct __sk_buff, cb[3]) + 2), 1934 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1935 offsetof(struct __sk_buff, cb[4])), 1936 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1937 offsetof(struct __sk_buff, cb[4]) + 2), 1938 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1939 offsetof(struct __sk_buff, cb[0])), 1940 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1941 offsetof(struct __sk_buff, cb[0]) + 2), 1942 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1943 offsetof(struct __sk_buff, cb[1])), 1944 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1945 offsetof(struct __sk_buff, cb[1]) + 2), 1946 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1947 offsetof(struct __sk_buff, cb[2])), 1948 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1949 offsetof(struct __sk_buff, cb[2]) + 2), 1950 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1951 offsetof(struct __sk_buff, cb[3])), 1952 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1953 offsetof(struct __sk_buff, cb[3]) + 2), 1954 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1955 offsetof(struct __sk_buff, cb[4])), 1956 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 1957 offsetof(struct __sk_buff, cb[4]) + 2), 1958 BPF_EXIT_INSN(), 1959 }, 1960 .result = ACCEPT, 1961 }, 1962 { 1963 "check cb access: half, unaligned", 1964 .insns = { 1965 BPF_MOV64_IMM(BPF_REG_0, 0), 1966 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1967 offsetof(struct __sk_buff, cb[0]) + 1), 1968 BPF_EXIT_INSN(), 1969 }, 1970 .errstr = "misaligned context access", 1971 .result = REJECT, 1972 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 1973 }, 1974 { 1975 "check __sk_buff->hash, offset 0, half store not permitted", 1976 .insns = { 1977 BPF_MOV64_IMM(BPF_REG_0, 0), 1978 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1979 offsetof(struct __sk_buff, hash)), 1980 BPF_EXIT_INSN(), 1981 }, 1982 .errstr = "invalid bpf_context access", 1983 .result = REJECT, 1984 }, 1985 { 1986 "check __sk_buff->tc_index, offset 2, half store not permitted", 1987 .insns = { 1988 BPF_MOV64_IMM(BPF_REG_0, 0), 1989 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 1990 offsetof(struct __sk_buff, tc_index) + 2), 1991 BPF_EXIT_INSN(), 1992 }, 1993 .errstr = "invalid bpf_context access", 1994 .result = REJECT, 1995 }, 1996 { 1997 "check skb->hash half load permitted", 1998 .insns = { 1999 BPF_MOV64_IMM(BPF_REG_0, 0), 2000 #if __BYTE_ORDER == __LITTLE_ENDIAN 2001 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2002 offsetof(struct __sk_buff, hash)), 2003 #else 2004 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2005 offsetof(struct __sk_buff, hash) + 2), 2006 #endif 2007 BPF_EXIT_INSN(), 2008 }, 2009 .result = ACCEPT, 2010 }, 2011 { 2012 "check skb->hash half load not permitted", 2013 .insns = { 2014 BPF_MOV64_IMM(BPF_REG_0, 0), 2015 #if __BYTE_ORDER == __LITTLE_ENDIAN 2016 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2017 offsetof(struct __sk_buff, hash) + 2), 2018 #else 2019 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 2020 offsetof(struct __sk_buff, hash)), 2021 #endif 2022 BPF_EXIT_INSN(), 2023 }, 2024 .errstr = "invalid bpf_context access", 2025 .result = REJECT, 2026 }, 2027 { 2028 "check cb access: half, wrong type", 2029 .insns = { 2030 BPF_MOV64_IMM(BPF_REG_0, 0), 2031 BPF_STX_MEM(BPF_H, BPF_REG_1, BPF_REG_0, 2032 offsetof(struct __sk_buff, cb[0])), 2033 BPF_EXIT_INSN(), 2034 }, 2035 .errstr = "invalid bpf_context access", 2036 .result = REJECT, 2037 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2038 }, 2039 { 2040 "check cb access: word", 2041 .insns = { 2042 BPF_MOV64_IMM(BPF_REG_0, 0), 2043 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2044 offsetof(struct __sk_buff, cb[0])), 2045 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2046 offsetof(struct __sk_buff, cb[1])), 2047 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2048 offsetof(struct __sk_buff, cb[2])), 2049 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2050 offsetof(struct __sk_buff, cb[3])), 2051 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2052 offsetof(struct __sk_buff, cb[4])), 2053 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2054 offsetof(struct __sk_buff, cb[0])), 2055 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2056 offsetof(struct __sk_buff, cb[1])), 2057 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2058 offsetof(struct __sk_buff, cb[2])), 2059 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2060 offsetof(struct __sk_buff, cb[3])), 2061 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2062 offsetof(struct __sk_buff, cb[4])), 2063 BPF_EXIT_INSN(), 2064 }, 2065 .result = ACCEPT, 2066 }, 2067 { 2068 "check cb access: word, unaligned 1", 2069 .insns = { 2070 BPF_MOV64_IMM(BPF_REG_0, 0), 2071 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2072 offsetof(struct __sk_buff, cb[0]) + 2), 2073 BPF_EXIT_INSN(), 2074 }, 2075 .errstr = "misaligned context access", 2076 .result = REJECT, 2077 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2078 }, 2079 { 2080 "check cb access: word, unaligned 2", 2081 .insns = { 2082 BPF_MOV64_IMM(BPF_REG_0, 0), 2083 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2084 offsetof(struct __sk_buff, cb[4]) + 1), 2085 BPF_EXIT_INSN(), 2086 }, 2087 .errstr = "misaligned context access", 2088 .result = REJECT, 2089 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2090 }, 2091 { 2092 "check cb access: word, unaligned 3", 2093 .insns = { 2094 BPF_MOV64_IMM(BPF_REG_0, 0), 2095 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2096 offsetof(struct __sk_buff, cb[4]) + 2), 2097 BPF_EXIT_INSN(), 2098 }, 2099 .errstr = "misaligned context access", 2100 .result = REJECT, 2101 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2102 }, 2103 { 2104 "check cb access: word, unaligned 4", 2105 .insns = { 2106 BPF_MOV64_IMM(BPF_REG_0, 0), 2107 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2108 offsetof(struct __sk_buff, cb[4]) + 3), 2109 BPF_EXIT_INSN(), 2110 }, 2111 .errstr = "misaligned context access", 2112 .result = REJECT, 2113 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2114 }, 2115 { 2116 "check cb access: double", 2117 .insns = { 2118 BPF_MOV64_IMM(BPF_REG_0, 0), 2119 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2120 offsetof(struct __sk_buff, cb[0])), 2121 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2122 offsetof(struct __sk_buff, cb[2])), 2123 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2124 offsetof(struct __sk_buff, cb[0])), 2125 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2126 offsetof(struct __sk_buff, cb[2])), 2127 BPF_EXIT_INSN(), 2128 }, 2129 .result = ACCEPT, 2130 }, 2131 { 2132 "check cb access: double, unaligned 1", 2133 .insns = { 2134 BPF_MOV64_IMM(BPF_REG_0, 0), 2135 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2136 offsetof(struct __sk_buff, cb[1])), 2137 BPF_EXIT_INSN(), 2138 }, 2139 .errstr = "misaligned context access", 2140 .result = REJECT, 2141 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2142 }, 2143 { 2144 "check cb access: double, unaligned 2", 2145 .insns = { 2146 BPF_MOV64_IMM(BPF_REG_0, 0), 2147 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2148 offsetof(struct __sk_buff, cb[3])), 2149 BPF_EXIT_INSN(), 2150 }, 2151 .errstr = "misaligned context access", 2152 .result = REJECT, 2153 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 2154 }, 2155 { 2156 "check cb access: double, oob 1", 2157 .insns = { 2158 BPF_MOV64_IMM(BPF_REG_0, 0), 2159 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2160 offsetof(struct __sk_buff, cb[4])), 2161 BPF_EXIT_INSN(), 2162 }, 2163 .errstr = "invalid bpf_context access", 2164 .result = REJECT, 2165 }, 2166 { 2167 "check cb access: double, oob 2", 2168 .insns = { 2169 BPF_MOV64_IMM(BPF_REG_0, 0), 2170 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2171 offsetof(struct __sk_buff, cb[4])), 2172 BPF_EXIT_INSN(), 2173 }, 2174 .errstr = "invalid bpf_context access", 2175 .result = REJECT, 2176 }, 2177 { 2178 "check __sk_buff->ifindex dw store not permitted", 2179 .insns = { 2180 BPF_MOV64_IMM(BPF_REG_0, 0), 2181 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2182 offsetof(struct __sk_buff, ifindex)), 2183 BPF_EXIT_INSN(), 2184 }, 2185 .errstr = "invalid bpf_context access", 2186 .result = REJECT, 2187 }, 2188 { 2189 "check __sk_buff->ifindex dw load not permitted", 2190 .insns = { 2191 BPF_MOV64_IMM(BPF_REG_0, 0), 2192 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2193 offsetof(struct __sk_buff, ifindex)), 2194 BPF_EXIT_INSN(), 2195 }, 2196 .errstr = "invalid bpf_context access", 2197 .result = REJECT, 2198 }, 2199 { 2200 "check cb access: double, wrong type", 2201 .insns = { 2202 BPF_MOV64_IMM(BPF_REG_0, 0), 2203 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 2204 offsetof(struct __sk_buff, cb[0])), 2205 BPF_EXIT_INSN(), 2206 }, 2207 .errstr = "invalid bpf_context access", 2208 .result = REJECT, 2209 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 2210 }, 2211 { 2212 "check out of range skb->cb access", 2213 .insns = { 2214 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2215 offsetof(struct __sk_buff, cb[0]) + 256), 2216 BPF_EXIT_INSN(), 2217 }, 2218 .errstr = "invalid bpf_context access", 2219 .errstr_unpriv = "", 2220 .result = REJECT, 2221 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 2222 }, 2223 { 2224 "write skb fields from socket prog", 2225 .insns = { 2226 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2227 offsetof(struct __sk_buff, cb[4])), 2228 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2229 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2230 offsetof(struct __sk_buff, mark)), 2231 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2232 offsetof(struct __sk_buff, tc_index)), 2233 BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1), 2234 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2235 offsetof(struct __sk_buff, cb[0])), 2236 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 2237 offsetof(struct __sk_buff, cb[2])), 2238 BPF_EXIT_INSN(), 2239 }, 2240 .result = ACCEPT, 2241 .errstr_unpriv = "R1 leaks addr", 2242 .result_unpriv = REJECT, 2243 }, 2244 { 2245 "write skb fields from tc_cls_act prog", 2246 .insns = { 2247 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2248 offsetof(struct __sk_buff, cb[0])), 2249 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2250 offsetof(struct __sk_buff, mark)), 2251 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2252 offsetof(struct __sk_buff, tc_index)), 2253 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2254 offsetof(struct __sk_buff, tc_index)), 2255 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 2256 offsetof(struct __sk_buff, cb[3])), 2257 BPF_EXIT_INSN(), 2258 }, 2259 .errstr_unpriv = "", 2260 .result_unpriv = REJECT, 2261 .result = ACCEPT, 2262 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2263 }, 2264 { 2265 "PTR_TO_STACK store/load", 2266 .insns = { 2267 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2268 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2269 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2270 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2271 BPF_EXIT_INSN(), 2272 }, 2273 .result = ACCEPT, 2274 .retval = 0xfaceb00c, 2275 }, 2276 { 2277 "PTR_TO_STACK store/load - bad alignment on off", 2278 .insns = { 2279 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2280 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2281 BPF_ST_MEM(BPF_DW, BPF_REG_1, 2, 0xfaceb00c), 2282 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 2), 2283 BPF_EXIT_INSN(), 2284 }, 2285 .result = REJECT, 2286 .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", 2287 }, 2288 { 2289 "PTR_TO_STACK store/load - bad alignment on reg", 2290 .insns = { 2291 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2292 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -10), 2293 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2294 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2295 BPF_EXIT_INSN(), 2296 }, 2297 .result = REJECT, 2298 .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", 2299 }, 2300 { 2301 "PTR_TO_STACK store/load - out of bounds low", 2302 .insns = { 2303 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2304 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -80000), 2305 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2306 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2307 BPF_EXIT_INSN(), 2308 }, 2309 .result = REJECT, 2310 .errstr = "invalid stack off=-79992 size=8", 2311 }, 2312 { 2313 "PTR_TO_STACK store/load - out of bounds high", 2314 .insns = { 2315 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2317 BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 0xfaceb00c), 2318 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8), 2319 BPF_EXIT_INSN(), 2320 }, 2321 .result = REJECT, 2322 .errstr = "invalid stack off=0 size=8", 2323 }, 2324 { 2325 "unpriv: return pointer", 2326 .insns = { 2327 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 2328 BPF_EXIT_INSN(), 2329 }, 2330 .result = ACCEPT, 2331 .result_unpriv = REJECT, 2332 .errstr_unpriv = "R0 leaks addr", 2333 .retval = POINTER_VALUE, 2334 }, 2335 { 2336 "unpriv: add const to pointer", 2337 .insns = { 2338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 2339 BPF_MOV64_IMM(BPF_REG_0, 0), 2340 BPF_EXIT_INSN(), 2341 }, 2342 .result = ACCEPT, 2343 }, 2344 { 2345 "unpriv: add pointer to pointer", 2346 .insns = { 2347 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 2348 BPF_MOV64_IMM(BPF_REG_0, 0), 2349 BPF_EXIT_INSN(), 2350 }, 2351 .result = REJECT, 2352 .errstr = "R1 pointer += pointer", 2353 }, 2354 { 2355 "unpriv: neg pointer", 2356 .insns = { 2357 BPF_ALU64_IMM(BPF_NEG, BPF_REG_1, 0), 2358 BPF_MOV64_IMM(BPF_REG_0, 0), 2359 BPF_EXIT_INSN(), 2360 }, 2361 .result = ACCEPT, 2362 .result_unpriv = REJECT, 2363 .errstr_unpriv = "R1 pointer arithmetic", 2364 }, 2365 { 2366 "unpriv: cmp pointer with const", 2367 .insns = { 2368 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 2369 BPF_MOV64_IMM(BPF_REG_0, 0), 2370 BPF_EXIT_INSN(), 2371 }, 2372 .result = ACCEPT, 2373 .result_unpriv = REJECT, 2374 .errstr_unpriv = "R1 pointer comparison", 2375 }, 2376 { 2377 "unpriv: cmp pointer with pointer", 2378 .insns = { 2379 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_10, 0), 2380 BPF_MOV64_IMM(BPF_REG_0, 0), 2381 BPF_EXIT_INSN(), 2382 }, 2383 .result = ACCEPT, 2384 .result_unpriv = REJECT, 2385 .errstr_unpriv = "R10 pointer comparison", 2386 }, 2387 { 2388 "unpriv: check that printk is disallowed", 2389 .insns = { 2390 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2391 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 2392 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 2393 BPF_MOV64_IMM(BPF_REG_2, 8), 2394 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2395 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2396 BPF_FUNC_trace_printk), 2397 BPF_MOV64_IMM(BPF_REG_0, 0), 2398 BPF_EXIT_INSN(), 2399 }, 2400 .errstr_unpriv = "unknown func bpf_trace_printk#6", 2401 .result_unpriv = REJECT, 2402 .result = ACCEPT, 2403 }, 2404 { 2405 "unpriv: pass pointer to helper function", 2406 .insns = { 2407 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2408 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2409 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2410 BPF_LD_MAP_FD(BPF_REG_1, 0), 2411 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 2412 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 2413 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2414 BPF_FUNC_map_update_elem), 2415 BPF_MOV64_IMM(BPF_REG_0, 0), 2416 BPF_EXIT_INSN(), 2417 }, 2418 .fixup_map1 = { 3 }, 2419 .errstr_unpriv = "R4 leaks addr", 2420 .result_unpriv = REJECT, 2421 .result = ACCEPT, 2422 }, 2423 { 2424 "unpriv: indirectly pass pointer on stack to helper function", 2425 .insns = { 2426 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2427 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2428 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2429 BPF_LD_MAP_FD(BPF_REG_1, 0), 2430 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2431 BPF_FUNC_map_lookup_elem), 2432 BPF_MOV64_IMM(BPF_REG_0, 0), 2433 BPF_EXIT_INSN(), 2434 }, 2435 .fixup_map1 = { 3 }, 2436 .errstr = "invalid indirect read from stack off -8+0 size 8", 2437 .result = REJECT, 2438 }, 2439 { 2440 "unpriv: mangle pointer on stack 1", 2441 .insns = { 2442 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2443 BPF_ST_MEM(BPF_W, BPF_REG_10, -8, 0), 2444 BPF_MOV64_IMM(BPF_REG_0, 0), 2445 BPF_EXIT_INSN(), 2446 }, 2447 .errstr_unpriv = "attempt to corrupt spilled", 2448 .result_unpriv = REJECT, 2449 .result = ACCEPT, 2450 }, 2451 { 2452 "unpriv: mangle pointer on stack 2", 2453 .insns = { 2454 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2455 BPF_ST_MEM(BPF_B, BPF_REG_10, -1, 0), 2456 BPF_MOV64_IMM(BPF_REG_0, 0), 2457 BPF_EXIT_INSN(), 2458 }, 2459 .errstr_unpriv = "attempt to corrupt spilled", 2460 .result_unpriv = REJECT, 2461 .result = ACCEPT, 2462 }, 2463 { 2464 "unpriv: read pointer from stack in small chunks", 2465 .insns = { 2466 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_10, -8), 2467 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8), 2468 BPF_MOV64_IMM(BPF_REG_0, 0), 2469 BPF_EXIT_INSN(), 2470 }, 2471 .errstr = "invalid size", 2472 .result = REJECT, 2473 }, 2474 { 2475 "unpriv: write pointer into ctx", 2476 .insns = { 2477 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 2478 BPF_MOV64_IMM(BPF_REG_0, 0), 2479 BPF_EXIT_INSN(), 2480 }, 2481 .errstr_unpriv = "R1 leaks addr", 2482 .result_unpriv = REJECT, 2483 .errstr = "invalid bpf_context access", 2484 .result = REJECT, 2485 }, 2486 { 2487 "unpriv: spill/fill of ctx", 2488 .insns = { 2489 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2490 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2491 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2492 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2493 BPF_MOV64_IMM(BPF_REG_0, 0), 2494 BPF_EXIT_INSN(), 2495 }, 2496 .result = ACCEPT, 2497 }, 2498 { 2499 "unpriv: spill/fill of ctx 2", 2500 .insns = { 2501 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2502 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2503 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2504 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2505 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2506 BPF_FUNC_get_hash_recalc), 2507 BPF_MOV64_IMM(BPF_REG_0, 0), 2508 BPF_EXIT_INSN(), 2509 }, 2510 .result = ACCEPT, 2511 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2512 }, 2513 { 2514 "unpriv: spill/fill of ctx 3", 2515 .insns = { 2516 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2517 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2518 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2519 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 2520 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2521 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2522 BPF_FUNC_get_hash_recalc), 2523 BPF_EXIT_INSN(), 2524 }, 2525 .result = REJECT, 2526 .errstr = "R1 type=fp expected=ctx", 2527 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2528 }, 2529 { 2530 "unpriv: spill/fill of ctx 4", 2531 .insns = { 2532 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2533 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2534 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2535 BPF_MOV64_IMM(BPF_REG_0, 1), 2536 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_10, 2537 BPF_REG_0, -8, 0), 2538 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2539 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2540 BPF_FUNC_get_hash_recalc), 2541 BPF_EXIT_INSN(), 2542 }, 2543 .result = REJECT, 2544 .errstr = "R1 type=inv expected=ctx", 2545 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2546 }, 2547 { 2548 "unpriv: spill/fill of different pointers stx", 2549 .insns = { 2550 BPF_MOV64_IMM(BPF_REG_3, 42), 2551 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2552 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2553 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2554 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2555 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 2556 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2557 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2558 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2559 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2560 BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_3, 2561 offsetof(struct __sk_buff, mark)), 2562 BPF_MOV64_IMM(BPF_REG_0, 0), 2563 BPF_EXIT_INSN(), 2564 }, 2565 .result = REJECT, 2566 .errstr = "same insn cannot be used with different pointers", 2567 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2568 }, 2569 { 2570 "unpriv: spill/fill of different pointers ldx", 2571 .insns = { 2572 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2573 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2574 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 2575 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2576 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 2577 -(__s32)offsetof(struct bpf_perf_event_data, 2578 sample_period) - 8), 2579 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_2, 0), 2580 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), 2581 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2582 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 0), 2583 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 2584 offsetof(struct bpf_perf_event_data, 2585 sample_period)), 2586 BPF_MOV64_IMM(BPF_REG_0, 0), 2587 BPF_EXIT_INSN(), 2588 }, 2589 .result = REJECT, 2590 .errstr = "same insn cannot be used with different pointers", 2591 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 2592 }, 2593 { 2594 "unpriv: write pointer into map elem value", 2595 .insns = { 2596 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 2597 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2598 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2599 BPF_LD_MAP_FD(BPF_REG_1, 0), 2600 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2601 BPF_FUNC_map_lookup_elem), 2602 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 2603 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 2604 BPF_EXIT_INSN(), 2605 }, 2606 .fixup_map1 = { 3 }, 2607 .errstr_unpriv = "R0 leaks addr", 2608 .result_unpriv = REJECT, 2609 .result = ACCEPT, 2610 }, 2611 { 2612 "unpriv: partial copy of pointer", 2613 .insns = { 2614 BPF_MOV32_REG(BPF_REG_1, BPF_REG_10), 2615 BPF_MOV64_IMM(BPF_REG_0, 0), 2616 BPF_EXIT_INSN(), 2617 }, 2618 .errstr_unpriv = "R10 partial copy", 2619 .result_unpriv = REJECT, 2620 .result = ACCEPT, 2621 }, 2622 { 2623 "unpriv: pass pointer to tail_call", 2624 .insns = { 2625 BPF_MOV64_REG(BPF_REG_3, BPF_REG_1), 2626 BPF_LD_MAP_FD(BPF_REG_2, 0), 2627 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2628 BPF_FUNC_tail_call), 2629 BPF_MOV64_IMM(BPF_REG_0, 0), 2630 BPF_EXIT_INSN(), 2631 }, 2632 .fixup_prog = { 1 }, 2633 .errstr_unpriv = "R3 leaks addr into helper", 2634 .result_unpriv = REJECT, 2635 .result = ACCEPT, 2636 }, 2637 { 2638 "unpriv: cmp map pointer with zero", 2639 .insns = { 2640 BPF_MOV64_IMM(BPF_REG_1, 0), 2641 BPF_LD_MAP_FD(BPF_REG_1, 0), 2642 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 2643 BPF_MOV64_IMM(BPF_REG_0, 0), 2644 BPF_EXIT_INSN(), 2645 }, 2646 .fixup_map1 = { 1 }, 2647 .errstr_unpriv = "R1 pointer comparison", 2648 .result_unpriv = REJECT, 2649 .result = ACCEPT, 2650 }, 2651 { 2652 "unpriv: write into frame pointer", 2653 .insns = { 2654 BPF_MOV64_REG(BPF_REG_10, BPF_REG_1), 2655 BPF_MOV64_IMM(BPF_REG_0, 0), 2656 BPF_EXIT_INSN(), 2657 }, 2658 .errstr = "frame pointer is read only", 2659 .result = REJECT, 2660 }, 2661 { 2662 "unpriv: spill/fill frame pointer", 2663 .insns = { 2664 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2665 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2666 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_10, 0), 2667 BPF_LDX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, 0), 2668 BPF_MOV64_IMM(BPF_REG_0, 0), 2669 BPF_EXIT_INSN(), 2670 }, 2671 .errstr = "frame pointer is read only", 2672 .result = REJECT, 2673 }, 2674 { 2675 "unpriv: cmp of frame pointer", 2676 .insns = { 2677 BPF_JMP_IMM(BPF_JEQ, BPF_REG_10, 0, 0), 2678 BPF_MOV64_IMM(BPF_REG_0, 0), 2679 BPF_EXIT_INSN(), 2680 }, 2681 .errstr_unpriv = "R10 pointer comparison", 2682 .result_unpriv = REJECT, 2683 .result = ACCEPT, 2684 }, 2685 { 2686 "unpriv: adding of fp", 2687 .insns = { 2688 BPF_MOV64_IMM(BPF_REG_0, 0), 2689 BPF_MOV64_IMM(BPF_REG_1, 0), 2690 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_10), 2691 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), 2692 BPF_EXIT_INSN(), 2693 }, 2694 .result = ACCEPT, 2695 }, 2696 { 2697 "unpriv: cmp of stack pointer", 2698 .insns = { 2699 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 2700 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 2701 BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 0), 2702 BPF_MOV64_IMM(BPF_REG_0, 0), 2703 BPF_EXIT_INSN(), 2704 }, 2705 .errstr_unpriv = "R2 pointer comparison", 2706 .result_unpriv = REJECT, 2707 .result = ACCEPT, 2708 }, 2709 { 2710 "runtime/jit: tail_call within bounds, prog once", 2711 .insns = { 2712 BPF_MOV64_IMM(BPF_REG_3, 0), 2713 BPF_LD_MAP_FD(BPF_REG_2, 0), 2714 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2715 BPF_FUNC_tail_call), 2716 BPF_MOV64_IMM(BPF_REG_0, 1), 2717 BPF_EXIT_INSN(), 2718 }, 2719 .fixup_prog = { 1 }, 2720 .result = ACCEPT, 2721 .retval = 42, 2722 }, 2723 { 2724 "runtime/jit: tail_call within bounds, prog loop", 2725 .insns = { 2726 BPF_MOV64_IMM(BPF_REG_3, 1), 2727 BPF_LD_MAP_FD(BPF_REG_2, 0), 2728 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2729 BPF_FUNC_tail_call), 2730 BPF_MOV64_IMM(BPF_REG_0, 1), 2731 BPF_EXIT_INSN(), 2732 }, 2733 .fixup_prog = { 1 }, 2734 .result = ACCEPT, 2735 .retval = 41, 2736 }, 2737 { 2738 "runtime/jit: tail_call within bounds, no prog", 2739 .insns = { 2740 BPF_MOV64_IMM(BPF_REG_3, 2), 2741 BPF_LD_MAP_FD(BPF_REG_2, 0), 2742 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2743 BPF_FUNC_tail_call), 2744 BPF_MOV64_IMM(BPF_REG_0, 1), 2745 BPF_EXIT_INSN(), 2746 }, 2747 .fixup_prog = { 1 }, 2748 .result = ACCEPT, 2749 .retval = 1, 2750 }, 2751 { 2752 "runtime/jit: tail_call out of bounds", 2753 .insns = { 2754 BPF_MOV64_IMM(BPF_REG_3, 256), 2755 BPF_LD_MAP_FD(BPF_REG_2, 0), 2756 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2757 BPF_FUNC_tail_call), 2758 BPF_MOV64_IMM(BPF_REG_0, 2), 2759 BPF_EXIT_INSN(), 2760 }, 2761 .fixup_prog = { 1 }, 2762 .result = ACCEPT, 2763 .retval = 2, 2764 }, 2765 { 2766 "runtime/jit: pass negative index to tail_call", 2767 .insns = { 2768 BPF_MOV64_IMM(BPF_REG_3, -1), 2769 BPF_LD_MAP_FD(BPF_REG_2, 0), 2770 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2771 BPF_FUNC_tail_call), 2772 BPF_MOV64_IMM(BPF_REG_0, 2), 2773 BPF_EXIT_INSN(), 2774 }, 2775 .fixup_prog = { 1 }, 2776 .result = ACCEPT, 2777 .retval = 2, 2778 }, 2779 { 2780 "runtime/jit: pass > 32bit index to tail_call", 2781 .insns = { 2782 BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL), 2783 BPF_LD_MAP_FD(BPF_REG_2, 0), 2784 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2785 BPF_FUNC_tail_call), 2786 BPF_MOV64_IMM(BPF_REG_0, 2), 2787 BPF_EXIT_INSN(), 2788 }, 2789 .fixup_prog = { 2 }, 2790 .result = ACCEPT, 2791 .retval = 42, 2792 }, 2793 { 2794 "stack pointer arithmetic", 2795 .insns = { 2796 BPF_MOV64_IMM(BPF_REG_1, 4), 2797 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 2798 BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), 2799 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 2800 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -10), 2801 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 2802 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 2803 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 2804 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 2805 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 2806 BPF_ST_MEM(0, BPF_REG_2, 4, 0), 2807 BPF_MOV64_IMM(BPF_REG_0, 0), 2808 BPF_EXIT_INSN(), 2809 }, 2810 .result = ACCEPT, 2811 }, 2812 { 2813 "raw_stack: no skb_load_bytes", 2814 .insns = { 2815 BPF_MOV64_IMM(BPF_REG_2, 4), 2816 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2817 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2818 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2819 BPF_MOV64_IMM(BPF_REG_4, 8), 2820 /* Call to skb_load_bytes() omitted. */ 2821 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2822 BPF_EXIT_INSN(), 2823 }, 2824 .result = REJECT, 2825 .errstr = "invalid read from stack off -8+0 size 8", 2826 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2827 }, 2828 { 2829 "raw_stack: skb_load_bytes, negative len", 2830 .insns = { 2831 BPF_MOV64_IMM(BPF_REG_2, 4), 2832 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2833 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2834 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2835 BPF_MOV64_IMM(BPF_REG_4, -8), 2836 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2837 BPF_FUNC_skb_load_bytes), 2838 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2839 BPF_EXIT_INSN(), 2840 }, 2841 .result = REJECT, 2842 .errstr = "R4 min value is negative", 2843 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2844 }, 2845 { 2846 "raw_stack: skb_load_bytes, negative len 2", 2847 .insns = { 2848 BPF_MOV64_IMM(BPF_REG_2, 4), 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_3, BPF_REG_6), 2852 BPF_MOV64_IMM(BPF_REG_4, ~0), 2853 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2854 BPF_FUNC_skb_load_bytes), 2855 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2856 BPF_EXIT_INSN(), 2857 }, 2858 .result = REJECT, 2859 .errstr = "R4 min value is negative", 2860 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2861 }, 2862 { 2863 "raw_stack: skb_load_bytes, zero len", 2864 .insns = { 2865 BPF_MOV64_IMM(BPF_REG_2, 4), 2866 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2867 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2868 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2869 BPF_MOV64_IMM(BPF_REG_4, 0), 2870 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2871 BPF_FUNC_skb_load_bytes), 2872 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2873 BPF_EXIT_INSN(), 2874 }, 2875 .result = REJECT, 2876 .errstr = "invalid stack type R3", 2877 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2878 }, 2879 { 2880 "raw_stack: skb_load_bytes, no init", 2881 .insns = { 2882 BPF_MOV64_IMM(BPF_REG_2, 4), 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_3, BPF_REG_6), 2886 BPF_MOV64_IMM(BPF_REG_4, 8), 2887 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2888 BPF_FUNC_skb_load_bytes), 2889 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2890 BPF_EXIT_INSN(), 2891 }, 2892 .result = ACCEPT, 2893 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2894 }, 2895 { 2896 "raw_stack: skb_load_bytes, init", 2897 .insns = { 2898 BPF_MOV64_IMM(BPF_REG_2, 4), 2899 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2900 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2901 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xcafe), 2902 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2903 BPF_MOV64_IMM(BPF_REG_4, 8), 2904 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2905 BPF_FUNC_skb_load_bytes), 2906 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2907 BPF_EXIT_INSN(), 2908 }, 2909 .result = ACCEPT, 2910 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2911 }, 2912 { 2913 "raw_stack: skb_load_bytes, spilled regs around bounds", 2914 .insns = { 2915 BPF_MOV64_IMM(BPF_REG_2, 4), 2916 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 2918 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 2919 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 2920 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2921 BPF_MOV64_IMM(BPF_REG_4, 8), 2922 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2923 BPF_FUNC_skb_load_bytes), 2924 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 2925 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 2926 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 2927 offsetof(struct __sk_buff, mark)), 2928 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 2929 offsetof(struct __sk_buff, priority)), 2930 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 2931 BPF_EXIT_INSN(), 2932 }, 2933 .result = ACCEPT, 2934 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2935 }, 2936 { 2937 "raw_stack: skb_load_bytes, spilled regs corruption", 2938 .insns = { 2939 BPF_MOV64_IMM(BPF_REG_2, 4), 2940 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2941 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -8), 2942 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2943 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2944 BPF_MOV64_IMM(BPF_REG_4, 8), 2945 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2946 BPF_FUNC_skb_load_bytes), 2947 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 2948 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 2949 offsetof(struct __sk_buff, mark)), 2950 BPF_EXIT_INSN(), 2951 }, 2952 .result = REJECT, 2953 .errstr = "R0 invalid mem access 'inv'", 2954 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2955 }, 2956 { 2957 "raw_stack: skb_load_bytes, spilled regs corruption 2", 2958 .insns = { 2959 BPF_MOV64_IMM(BPF_REG_2, 4), 2960 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2961 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 2962 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 2963 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2964 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 2965 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2966 BPF_MOV64_IMM(BPF_REG_4, 8), 2967 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2968 BPF_FUNC_skb_load_bytes), 2969 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 2970 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 2971 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 2972 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 2973 offsetof(struct __sk_buff, mark)), 2974 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 2975 offsetof(struct __sk_buff, priority)), 2976 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 2977 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_3, 2978 offsetof(struct __sk_buff, pkt_type)), 2979 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 2980 BPF_EXIT_INSN(), 2981 }, 2982 .result = REJECT, 2983 .errstr = "R3 invalid mem access 'inv'", 2984 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2985 }, 2986 { 2987 "raw_stack: skb_load_bytes, spilled regs + data", 2988 .insns = { 2989 BPF_MOV64_IMM(BPF_REG_2, 4), 2990 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 2991 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -16), 2992 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 2993 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 2994 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 8), 2995 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 2996 BPF_MOV64_IMM(BPF_REG_4, 8), 2997 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 2998 BPF_FUNC_skb_load_bytes), 2999 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, -8), 3000 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 8), 3001 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_6, 0), 3002 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3003 offsetof(struct __sk_buff, mark)), 3004 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 3005 offsetof(struct __sk_buff, priority)), 3006 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3007 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 3008 BPF_EXIT_INSN(), 3009 }, 3010 .result = ACCEPT, 3011 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3012 }, 3013 { 3014 "raw_stack: skb_load_bytes, invalid access 1", 3015 .insns = { 3016 BPF_MOV64_IMM(BPF_REG_2, 4), 3017 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3018 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -513), 3019 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3020 BPF_MOV64_IMM(BPF_REG_4, 8), 3021 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3022 BPF_FUNC_skb_load_bytes), 3023 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3024 BPF_EXIT_INSN(), 3025 }, 3026 .result = REJECT, 3027 .errstr = "invalid stack type R3 off=-513 access_size=8", 3028 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3029 }, 3030 { 3031 "raw_stack: skb_load_bytes, invalid access 2", 3032 .insns = { 3033 BPF_MOV64_IMM(BPF_REG_2, 4), 3034 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3035 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3036 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3037 BPF_MOV64_IMM(BPF_REG_4, 8), 3038 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3039 BPF_FUNC_skb_load_bytes), 3040 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3041 BPF_EXIT_INSN(), 3042 }, 3043 .result = REJECT, 3044 .errstr = "invalid stack type R3 off=-1 access_size=8", 3045 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3046 }, 3047 { 3048 "raw_stack: skb_load_bytes, invalid access 3", 3049 .insns = { 3050 BPF_MOV64_IMM(BPF_REG_2, 4), 3051 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3052 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 0xffffffff), 3053 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3054 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3055 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3056 BPF_FUNC_skb_load_bytes), 3057 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3058 BPF_EXIT_INSN(), 3059 }, 3060 .result = REJECT, 3061 .errstr = "R4 min value is negative", 3062 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3063 }, 3064 { 3065 "raw_stack: skb_load_bytes, invalid access 4", 3066 .insns = { 3067 BPF_MOV64_IMM(BPF_REG_2, 4), 3068 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3069 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -1), 3070 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3071 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3072 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3073 BPF_FUNC_skb_load_bytes), 3074 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3075 BPF_EXIT_INSN(), 3076 }, 3077 .result = REJECT, 3078 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3079 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3080 }, 3081 { 3082 "raw_stack: skb_load_bytes, invalid access 5", 3083 .insns = { 3084 BPF_MOV64_IMM(BPF_REG_2, 4), 3085 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3086 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3087 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3088 BPF_MOV64_IMM(BPF_REG_4, 0x7fffffff), 3089 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3090 BPF_FUNC_skb_load_bytes), 3091 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3092 BPF_EXIT_INSN(), 3093 }, 3094 .result = REJECT, 3095 .errstr = "R4 unbounded memory access, use 'var &= const' or 'if (var < const)'", 3096 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3097 }, 3098 { 3099 "raw_stack: skb_load_bytes, invalid access 6", 3100 .insns = { 3101 BPF_MOV64_IMM(BPF_REG_2, 4), 3102 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3103 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3104 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3105 BPF_MOV64_IMM(BPF_REG_4, 0), 3106 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3107 BPF_FUNC_skb_load_bytes), 3108 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3109 BPF_EXIT_INSN(), 3110 }, 3111 .result = REJECT, 3112 .errstr = "invalid stack type R3 off=-512 access_size=0", 3113 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3114 }, 3115 { 3116 "raw_stack: skb_load_bytes, large access", 3117 .insns = { 3118 BPF_MOV64_IMM(BPF_REG_2, 4), 3119 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_10), 3120 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -512), 3121 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3122 BPF_MOV64_IMM(BPF_REG_4, 512), 3123 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3124 BPF_FUNC_skb_load_bytes), 3125 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3126 BPF_EXIT_INSN(), 3127 }, 3128 .result = ACCEPT, 3129 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3130 }, 3131 { 3132 "context stores via ST", 3133 .insns = { 3134 BPF_MOV64_IMM(BPF_REG_0, 0), 3135 BPF_ST_MEM(BPF_DW, BPF_REG_1, offsetof(struct __sk_buff, mark), 0), 3136 BPF_EXIT_INSN(), 3137 }, 3138 .errstr = "BPF_ST stores into R1 context is not allowed", 3139 .result = REJECT, 3140 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3141 }, 3142 { 3143 "context stores via XADD", 3144 .insns = { 3145 BPF_MOV64_IMM(BPF_REG_0, 0), 3146 BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_W, BPF_REG_1, 3147 BPF_REG_0, offsetof(struct __sk_buff, mark), 0), 3148 BPF_EXIT_INSN(), 3149 }, 3150 .errstr = "BPF_XADD stores into R1 context is not allowed", 3151 .result = REJECT, 3152 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3153 }, 3154 { 3155 "direct packet access: test1", 3156 .insns = { 3157 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3158 offsetof(struct __sk_buff, data)), 3159 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3160 offsetof(struct __sk_buff, data_end)), 3161 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3162 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3163 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3164 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3165 BPF_MOV64_IMM(BPF_REG_0, 0), 3166 BPF_EXIT_INSN(), 3167 }, 3168 .result = ACCEPT, 3169 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3170 }, 3171 { 3172 "direct packet access: test2", 3173 .insns = { 3174 BPF_MOV64_IMM(BPF_REG_0, 1), 3175 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 3176 offsetof(struct __sk_buff, data_end)), 3177 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3178 offsetof(struct __sk_buff, data)), 3179 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3180 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 14), 3181 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 15), 3182 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 7), 3183 BPF_LDX_MEM(BPF_B, BPF_REG_4, BPF_REG_3, 12), 3184 BPF_ALU64_IMM(BPF_MUL, BPF_REG_4, 14), 3185 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3186 offsetof(struct __sk_buff, data)), 3187 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), 3188 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3189 offsetof(struct __sk_buff, len)), 3190 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), 3191 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), 3192 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), 3193 BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 3194 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 3195 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 3196 offsetof(struct __sk_buff, data_end)), 3197 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 3198 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_3, 4), 3199 BPF_MOV64_IMM(BPF_REG_0, 0), 3200 BPF_EXIT_INSN(), 3201 }, 3202 .result = ACCEPT, 3203 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3204 }, 3205 { 3206 "direct packet access: test3", 3207 .insns = { 3208 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3209 offsetof(struct __sk_buff, data)), 3210 BPF_MOV64_IMM(BPF_REG_0, 0), 3211 BPF_EXIT_INSN(), 3212 }, 3213 .errstr = "invalid bpf_context access off=76", 3214 .result = REJECT, 3215 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 3216 }, 3217 { 3218 "direct packet access: test4 (write)", 3219 .insns = { 3220 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3221 offsetof(struct __sk_buff, data)), 3222 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3223 offsetof(struct __sk_buff, data_end)), 3224 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3225 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3226 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3227 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3228 BPF_MOV64_IMM(BPF_REG_0, 0), 3229 BPF_EXIT_INSN(), 3230 }, 3231 .result = ACCEPT, 3232 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3233 }, 3234 { 3235 "direct packet access: test5 (pkt_end >= reg, good access)", 3236 .insns = { 3237 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3238 offsetof(struct __sk_buff, data)), 3239 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3240 offsetof(struct __sk_buff, data_end)), 3241 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3242 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3243 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3244 BPF_MOV64_IMM(BPF_REG_0, 1), 3245 BPF_EXIT_INSN(), 3246 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3247 BPF_MOV64_IMM(BPF_REG_0, 0), 3248 BPF_EXIT_INSN(), 3249 }, 3250 .result = ACCEPT, 3251 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3252 }, 3253 { 3254 "direct packet access: test6 (pkt_end >= reg, bad access)", 3255 .insns = { 3256 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3257 offsetof(struct __sk_buff, data)), 3258 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3259 offsetof(struct __sk_buff, data_end)), 3260 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3261 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3262 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3263 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3264 BPF_MOV64_IMM(BPF_REG_0, 1), 3265 BPF_EXIT_INSN(), 3266 BPF_MOV64_IMM(BPF_REG_0, 0), 3267 BPF_EXIT_INSN(), 3268 }, 3269 .errstr = "invalid access to packet", 3270 .result = REJECT, 3271 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3272 }, 3273 { 3274 "direct packet access: test7 (pkt_end >= reg, both accesses)", 3275 .insns = { 3276 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3277 offsetof(struct __sk_buff, data)), 3278 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3279 offsetof(struct __sk_buff, data_end)), 3280 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3281 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3282 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 3), 3283 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3284 BPF_MOV64_IMM(BPF_REG_0, 1), 3285 BPF_EXIT_INSN(), 3286 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3287 BPF_MOV64_IMM(BPF_REG_0, 0), 3288 BPF_EXIT_INSN(), 3289 }, 3290 .errstr = "invalid access to packet", 3291 .result = REJECT, 3292 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3293 }, 3294 { 3295 "direct packet access: test8 (double test, variant 1)", 3296 .insns = { 3297 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3298 offsetof(struct __sk_buff, data)), 3299 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3300 offsetof(struct __sk_buff, data_end)), 3301 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3302 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3303 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 4), 3304 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3305 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3306 BPF_MOV64_IMM(BPF_REG_0, 1), 3307 BPF_EXIT_INSN(), 3308 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3309 BPF_MOV64_IMM(BPF_REG_0, 0), 3310 BPF_EXIT_INSN(), 3311 }, 3312 .result = ACCEPT, 3313 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3314 }, 3315 { 3316 "direct packet access: test9 (double test, variant 2)", 3317 .insns = { 3318 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3319 offsetof(struct __sk_buff, data)), 3320 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3321 offsetof(struct __sk_buff, data_end)), 3322 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3323 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3324 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_0, 2), 3325 BPF_MOV64_IMM(BPF_REG_0, 1), 3326 BPF_EXIT_INSN(), 3327 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3328 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3329 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3330 BPF_MOV64_IMM(BPF_REG_0, 0), 3331 BPF_EXIT_INSN(), 3332 }, 3333 .result = ACCEPT, 3334 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3335 }, 3336 { 3337 "direct packet access: test10 (write invalid)", 3338 .insns = { 3339 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3340 offsetof(struct __sk_buff, data)), 3341 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3342 offsetof(struct __sk_buff, data_end)), 3343 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3344 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3345 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 3346 BPF_MOV64_IMM(BPF_REG_0, 0), 3347 BPF_EXIT_INSN(), 3348 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3349 BPF_MOV64_IMM(BPF_REG_0, 0), 3350 BPF_EXIT_INSN(), 3351 }, 3352 .errstr = "invalid access to packet", 3353 .result = REJECT, 3354 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3355 }, 3356 { 3357 "direct packet access: test11 (shift, good access)", 3358 .insns = { 3359 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3360 offsetof(struct __sk_buff, data)), 3361 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3362 offsetof(struct __sk_buff, data_end)), 3363 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3364 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3365 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3366 BPF_MOV64_IMM(BPF_REG_3, 144), 3367 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3368 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3369 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 3), 3370 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3371 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3372 BPF_MOV64_IMM(BPF_REG_0, 1), 3373 BPF_EXIT_INSN(), 3374 BPF_MOV64_IMM(BPF_REG_0, 0), 3375 BPF_EXIT_INSN(), 3376 }, 3377 .result = ACCEPT, 3378 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3379 .retval = 1, 3380 }, 3381 { 3382 "direct packet access: test12 (and, good access)", 3383 .insns = { 3384 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3385 offsetof(struct __sk_buff, data)), 3386 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3387 offsetof(struct __sk_buff, data_end)), 3388 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3389 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3390 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3391 BPF_MOV64_IMM(BPF_REG_3, 144), 3392 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3393 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3394 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 3395 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3396 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3397 BPF_MOV64_IMM(BPF_REG_0, 1), 3398 BPF_EXIT_INSN(), 3399 BPF_MOV64_IMM(BPF_REG_0, 0), 3400 BPF_EXIT_INSN(), 3401 }, 3402 .result = ACCEPT, 3403 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3404 .retval = 1, 3405 }, 3406 { 3407 "direct packet access: test13 (branches, good access)", 3408 .insns = { 3409 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3410 offsetof(struct __sk_buff, data)), 3411 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3412 offsetof(struct __sk_buff, data_end)), 3413 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3414 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3415 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 13), 3416 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3417 offsetof(struct __sk_buff, mark)), 3418 BPF_MOV64_IMM(BPF_REG_4, 1), 3419 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_4, 2), 3420 BPF_MOV64_IMM(BPF_REG_3, 14), 3421 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 3422 BPF_MOV64_IMM(BPF_REG_3, 24), 3423 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 3424 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 23), 3425 BPF_ALU64_IMM(BPF_AND, BPF_REG_5, 15), 3426 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3427 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3428 BPF_MOV64_IMM(BPF_REG_0, 1), 3429 BPF_EXIT_INSN(), 3430 BPF_MOV64_IMM(BPF_REG_0, 0), 3431 BPF_EXIT_INSN(), 3432 }, 3433 .result = ACCEPT, 3434 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3435 .retval = 1, 3436 }, 3437 { 3438 "direct packet access: test14 (pkt_ptr += 0, CONST_IMM, good access)", 3439 .insns = { 3440 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3441 offsetof(struct __sk_buff, data)), 3442 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3443 offsetof(struct __sk_buff, data_end)), 3444 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3445 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 22), 3446 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 3447 BPF_MOV64_IMM(BPF_REG_5, 12), 3448 BPF_ALU64_IMM(BPF_RSH, BPF_REG_5, 4), 3449 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 3450 BPF_ALU64_REG(BPF_ADD, BPF_REG_6, BPF_REG_5), 3451 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 3452 BPF_MOV64_IMM(BPF_REG_0, 1), 3453 BPF_EXIT_INSN(), 3454 BPF_MOV64_IMM(BPF_REG_0, 0), 3455 BPF_EXIT_INSN(), 3456 }, 3457 .result = ACCEPT, 3458 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3459 .retval = 1, 3460 }, 3461 { 3462 "direct packet access: test15 (spill with xadd)", 3463 .insns = { 3464 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3465 offsetof(struct __sk_buff, data)), 3466 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3467 offsetof(struct __sk_buff, data_end)), 3468 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3469 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3470 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 8), 3471 BPF_MOV64_IMM(BPF_REG_5, 4096), 3472 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 3473 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 3474 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 3475 BPF_STX_XADD(BPF_DW, BPF_REG_4, BPF_REG_5, 0), 3476 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 3477 BPF_STX_MEM(BPF_W, BPF_REG_2, BPF_REG_5, 0), 3478 BPF_MOV64_IMM(BPF_REG_0, 0), 3479 BPF_EXIT_INSN(), 3480 }, 3481 .errstr = "R2 invalid mem access 'inv'", 3482 .result = REJECT, 3483 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3484 }, 3485 { 3486 "direct packet access: test16 (arith on data_end)", 3487 .insns = { 3488 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3489 offsetof(struct __sk_buff, data)), 3490 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3491 offsetof(struct __sk_buff, data_end)), 3492 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3493 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3494 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 16), 3495 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3496 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3497 BPF_MOV64_IMM(BPF_REG_0, 0), 3498 BPF_EXIT_INSN(), 3499 }, 3500 .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", 3501 .result = REJECT, 3502 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3503 }, 3504 { 3505 "direct packet access: test17 (pruning, alignment)", 3506 .insns = { 3507 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3508 offsetof(struct __sk_buff, data)), 3509 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3510 offsetof(struct __sk_buff, data_end)), 3511 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 3512 offsetof(struct __sk_buff, mark)), 3513 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3514 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 14), 3515 BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 1, 4), 3516 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3517 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, -4), 3518 BPF_MOV64_IMM(BPF_REG_0, 0), 3519 BPF_EXIT_INSN(), 3520 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 3521 BPF_JMP_A(-6), 3522 }, 3523 .errstr = "misaligned packet access off 2+(0x0; 0x0)+15+-4 size 4", 3524 .result = REJECT, 3525 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3526 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 3527 }, 3528 { 3529 "direct packet access: test18 (imm += pkt_ptr, 1)", 3530 .insns = { 3531 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3532 offsetof(struct __sk_buff, data)), 3533 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3534 offsetof(struct __sk_buff, data_end)), 3535 BPF_MOV64_IMM(BPF_REG_0, 8), 3536 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3537 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3538 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 3539 BPF_MOV64_IMM(BPF_REG_0, 0), 3540 BPF_EXIT_INSN(), 3541 }, 3542 .result = ACCEPT, 3543 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3544 }, 3545 { 3546 "direct packet access: test19 (imm += pkt_ptr, 2)", 3547 .insns = { 3548 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3549 offsetof(struct __sk_buff, data)), 3550 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3551 offsetof(struct __sk_buff, data_end)), 3552 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3553 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3554 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 3555 BPF_MOV64_IMM(BPF_REG_4, 4), 3556 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3557 BPF_STX_MEM(BPF_B, BPF_REG_4, BPF_REG_4, 0), 3558 BPF_MOV64_IMM(BPF_REG_0, 0), 3559 BPF_EXIT_INSN(), 3560 }, 3561 .result = ACCEPT, 3562 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3563 }, 3564 { 3565 "direct packet access: test20 (x += pkt_ptr, 1)", 3566 .insns = { 3567 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3568 offsetof(struct __sk_buff, data)), 3569 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3570 offsetof(struct __sk_buff, data_end)), 3571 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 3572 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 3573 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 3574 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0x7fff), 3575 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 3576 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3577 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3578 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 3579 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 3580 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 3581 BPF_MOV64_IMM(BPF_REG_0, 0), 3582 BPF_EXIT_INSN(), 3583 }, 3584 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3585 .result = ACCEPT, 3586 }, 3587 { 3588 "direct packet access: test21 (x += pkt_ptr, 2)", 3589 .insns = { 3590 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3591 offsetof(struct __sk_buff, data)), 3592 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3593 offsetof(struct __sk_buff, data_end)), 3594 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3595 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3596 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 9), 3597 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3598 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 3599 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 3600 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, 0x7fff), 3601 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3602 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3603 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0x7fff - 1), 3604 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 3605 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_4, 0), 3606 BPF_MOV64_IMM(BPF_REG_0, 0), 3607 BPF_EXIT_INSN(), 3608 }, 3609 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3610 .result = ACCEPT, 3611 }, 3612 { 3613 "direct packet access: test22 (x += pkt_ptr, 3)", 3614 .insns = { 3615 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3616 offsetof(struct __sk_buff, data)), 3617 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3618 offsetof(struct __sk_buff, data_end)), 3619 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3620 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3621 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -8), 3622 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_3, -16), 3623 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_10, -16), 3624 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 11), 3625 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -8), 3626 BPF_MOV64_IMM(BPF_REG_4, 0xffffffff), 3627 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_4, -8), 3628 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 3629 BPF_ALU64_IMM(BPF_RSH, BPF_REG_4, 49), 3630 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_2), 3631 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 3632 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2), 3633 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 3634 BPF_MOV64_IMM(BPF_REG_2, 1), 3635 BPF_STX_MEM(BPF_H, BPF_REG_4, BPF_REG_2, 0), 3636 BPF_MOV64_IMM(BPF_REG_0, 0), 3637 BPF_EXIT_INSN(), 3638 }, 3639 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3640 .result = ACCEPT, 3641 }, 3642 { 3643 "direct packet access: test23 (x += pkt_ptr, 4)", 3644 .insns = { 3645 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3646 offsetof(struct __sk_buff, data)), 3647 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3648 offsetof(struct __sk_buff, data_end)), 3649 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 3650 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 3651 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 3652 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), 3653 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 3654 BPF_MOV64_IMM(BPF_REG_0, 31), 3655 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 3656 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3657 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 3658 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0xffff - 1), 3659 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3660 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 3661 BPF_MOV64_IMM(BPF_REG_0, 0), 3662 BPF_EXIT_INSN(), 3663 }, 3664 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3665 .result = REJECT, 3666 .errstr = "invalid access to packet, off=0 size=8, R5(id=1,off=0,r=0)", 3667 }, 3668 { 3669 "direct packet access: test24 (x += pkt_ptr, 5)", 3670 .insns = { 3671 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3672 offsetof(struct __sk_buff, data)), 3673 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3674 offsetof(struct __sk_buff, data_end)), 3675 BPF_MOV64_IMM(BPF_REG_0, 0xffffffff), 3676 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 3677 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 3678 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xff), 3679 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 3680 BPF_MOV64_IMM(BPF_REG_0, 64), 3681 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_4), 3682 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3683 BPF_MOV64_REG(BPF_REG_5, BPF_REG_0), 3684 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7fff - 1), 3685 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 3686 BPF_STX_MEM(BPF_DW, BPF_REG_5, BPF_REG_0, 0), 3687 BPF_MOV64_IMM(BPF_REG_0, 0), 3688 BPF_EXIT_INSN(), 3689 }, 3690 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3691 .result = ACCEPT, 3692 }, 3693 { 3694 "direct packet access: test25 (marking on <, good access)", 3695 .insns = { 3696 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3697 offsetof(struct __sk_buff, data)), 3698 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3699 offsetof(struct __sk_buff, data_end)), 3700 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3701 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3702 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 2), 3703 BPF_MOV64_IMM(BPF_REG_0, 0), 3704 BPF_EXIT_INSN(), 3705 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3706 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 3707 }, 3708 .result = ACCEPT, 3709 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3710 }, 3711 { 3712 "direct packet access: test26 (marking on <, bad access)", 3713 .insns = { 3714 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3715 offsetof(struct __sk_buff, data)), 3716 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3717 offsetof(struct __sk_buff, data_end)), 3718 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3719 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3720 BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_3, 3), 3721 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3722 BPF_MOV64_IMM(BPF_REG_0, 0), 3723 BPF_EXIT_INSN(), 3724 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 3725 }, 3726 .result = REJECT, 3727 .errstr = "invalid access to packet", 3728 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3729 }, 3730 { 3731 "direct packet access: test27 (marking on <=, good access)", 3732 .insns = { 3733 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3734 offsetof(struct __sk_buff, data)), 3735 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3736 offsetof(struct __sk_buff, data_end)), 3737 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3738 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3739 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 1), 3740 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3741 BPF_MOV64_IMM(BPF_REG_0, 1), 3742 BPF_EXIT_INSN(), 3743 }, 3744 .result = ACCEPT, 3745 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3746 .retval = 1, 3747 }, 3748 { 3749 "direct packet access: test28 (marking on <=, bad access)", 3750 .insns = { 3751 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3752 offsetof(struct __sk_buff, data)), 3753 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3754 offsetof(struct __sk_buff, data_end)), 3755 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3756 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 3757 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_0, 2), 3758 BPF_MOV64_IMM(BPF_REG_0, 1), 3759 BPF_EXIT_INSN(), 3760 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 3761 BPF_JMP_IMM(BPF_JA, 0, 0, -4), 3762 }, 3763 .result = REJECT, 3764 .errstr = "invalid access to packet", 3765 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3766 }, 3767 { 3768 "helper access to packet: test1, valid packet_ptr range", 3769 .insns = { 3770 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3771 offsetof(struct xdp_md, data)), 3772 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3773 offsetof(struct xdp_md, data_end)), 3774 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 3775 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 3776 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 3777 BPF_LD_MAP_FD(BPF_REG_1, 0), 3778 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 3779 BPF_MOV64_IMM(BPF_REG_4, 0), 3780 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3781 BPF_FUNC_map_update_elem), 3782 BPF_MOV64_IMM(BPF_REG_0, 0), 3783 BPF_EXIT_INSN(), 3784 }, 3785 .fixup_map1 = { 5 }, 3786 .result_unpriv = ACCEPT, 3787 .result = ACCEPT, 3788 .prog_type = BPF_PROG_TYPE_XDP, 3789 }, 3790 { 3791 "helper access to packet: test2, unchecked packet_ptr", 3792 .insns = { 3793 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3794 offsetof(struct xdp_md, data)), 3795 BPF_LD_MAP_FD(BPF_REG_1, 0), 3796 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3797 BPF_FUNC_map_lookup_elem), 3798 BPF_MOV64_IMM(BPF_REG_0, 0), 3799 BPF_EXIT_INSN(), 3800 }, 3801 .fixup_map1 = { 1 }, 3802 .result = REJECT, 3803 .errstr = "invalid access to packet", 3804 .prog_type = BPF_PROG_TYPE_XDP, 3805 }, 3806 { 3807 "helper access to packet: test3, variable add", 3808 .insns = { 3809 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3810 offsetof(struct xdp_md, data)), 3811 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3812 offsetof(struct xdp_md, data_end)), 3813 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3814 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 3815 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 3816 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 3817 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3818 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 3819 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3820 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 3821 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 3822 BPF_LD_MAP_FD(BPF_REG_1, 0), 3823 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 3824 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3825 BPF_FUNC_map_lookup_elem), 3826 BPF_MOV64_IMM(BPF_REG_0, 0), 3827 BPF_EXIT_INSN(), 3828 }, 3829 .fixup_map1 = { 11 }, 3830 .result = ACCEPT, 3831 .prog_type = BPF_PROG_TYPE_XDP, 3832 }, 3833 { 3834 "helper access to packet: test4, packet_ptr with bad range", 3835 .insns = { 3836 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3837 offsetof(struct xdp_md, data)), 3838 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3839 offsetof(struct xdp_md, data_end)), 3840 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3841 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 3842 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 3843 BPF_MOV64_IMM(BPF_REG_0, 0), 3844 BPF_EXIT_INSN(), 3845 BPF_LD_MAP_FD(BPF_REG_1, 0), 3846 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3847 BPF_FUNC_map_lookup_elem), 3848 BPF_MOV64_IMM(BPF_REG_0, 0), 3849 BPF_EXIT_INSN(), 3850 }, 3851 .fixup_map1 = { 7 }, 3852 .result = REJECT, 3853 .errstr = "invalid access to packet", 3854 .prog_type = BPF_PROG_TYPE_XDP, 3855 }, 3856 { 3857 "helper access to packet: test5, packet_ptr with too short range", 3858 .insns = { 3859 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3860 offsetof(struct xdp_md, data)), 3861 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3862 offsetof(struct xdp_md, data_end)), 3863 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 3864 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3865 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 3866 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 3867 BPF_LD_MAP_FD(BPF_REG_1, 0), 3868 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3869 BPF_FUNC_map_lookup_elem), 3870 BPF_MOV64_IMM(BPF_REG_0, 0), 3871 BPF_EXIT_INSN(), 3872 }, 3873 .fixup_map1 = { 6 }, 3874 .result = REJECT, 3875 .errstr = "invalid access to packet", 3876 .prog_type = BPF_PROG_TYPE_XDP, 3877 }, 3878 { 3879 "helper access to packet: test6, cls valid packet_ptr range", 3880 .insns = { 3881 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3882 offsetof(struct __sk_buff, data)), 3883 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3884 offsetof(struct __sk_buff, data_end)), 3885 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 3886 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 3887 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 5), 3888 BPF_LD_MAP_FD(BPF_REG_1, 0), 3889 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 3890 BPF_MOV64_IMM(BPF_REG_4, 0), 3891 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3892 BPF_FUNC_map_update_elem), 3893 BPF_MOV64_IMM(BPF_REG_0, 0), 3894 BPF_EXIT_INSN(), 3895 }, 3896 .fixup_map1 = { 5 }, 3897 .result = ACCEPT, 3898 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3899 }, 3900 { 3901 "helper access to packet: test7, cls unchecked packet_ptr", 3902 .insns = { 3903 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3904 offsetof(struct __sk_buff, data)), 3905 BPF_LD_MAP_FD(BPF_REG_1, 0), 3906 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3907 BPF_FUNC_map_lookup_elem), 3908 BPF_MOV64_IMM(BPF_REG_0, 0), 3909 BPF_EXIT_INSN(), 3910 }, 3911 .fixup_map1 = { 1 }, 3912 .result = REJECT, 3913 .errstr = "invalid access to packet", 3914 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3915 }, 3916 { 3917 "helper access to packet: test8, cls variable add", 3918 .insns = { 3919 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3920 offsetof(struct __sk_buff, data)), 3921 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3922 offsetof(struct __sk_buff, data_end)), 3923 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3924 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 3925 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 10), 3926 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_2, 0), 3927 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3928 BPF_ALU64_REG(BPF_ADD, BPF_REG_4, BPF_REG_5), 3929 BPF_MOV64_REG(BPF_REG_5, BPF_REG_4), 3930 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 8), 3931 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 4), 3932 BPF_LD_MAP_FD(BPF_REG_1, 0), 3933 BPF_MOV64_REG(BPF_REG_2, BPF_REG_4), 3934 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3935 BPF_FUNC_map_lookup_elem), 3936 BPF_MOV64_IMM(BPF_REG_0, 0), 3937 BPF_EXIT_INSN(), 3938 }, 3939 .fixup_map1 = { 11 }, 3940 .result = ACCEPT, 3941 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3942 }, 3943 { 3944 "helper access to packet: test9, cls packet_ptr with bad range", 3945 .insns = { 3946 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3947 offsetof(struct __sk_buff, data)), 3948 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3949 offsetof(struct __sk_buff, data_end)), 3950 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3951 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 4), 3952 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 2), 3953 BPF_MOV64_IMM(BPF_REG_0, 0), 3954 BPF_EXIT_INSN(), 3955 BPF_LD_MAP_FD(BPF_REG_1, 0), 3956 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3957 BPF_FUNC_map_lookup_elem), 3958 BPF_MOV64_IMM(BPF_REG_0, 0), 3959 BPF_EXIT_INSN(), 3960 }, 3961 .fixup_map1 = { 7 }, 3962 .result = REJECT, 3963 .errstr = "invalid access to packet", 3964 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3965 }, 3966 { 3967 "helper access to packet: test10, cls packet_ptr with too short range", 3968 .insns = { 3969 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 3970 offsetof(struct __sk_buff, data)), 3971 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 3972 offsetof(struct __sk_buff, data_end)), 3973 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 3974 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 3975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 7), 3976 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 3), 3977 BPF_LD_MAP_FD(BPF_REG_1, 0), 3978 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 3979 BPF_FUNC_map_lookup_elem), 3980 BPF_MOV64_IMM(BPF_REG_0, 0), 3981 BPF_EXIT_INSN(), 3982 }, 3983 .fixup_map1 = { 6 }, 3984 .result = REJECT, 3985 .errstr = "invalid access to packet", 3986 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 3987 }, 3988 { 3989 "helper access to packet: test11, cls unsuitable helper 1", 3990 .insns = { 3991 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 3992 offsetof(struct __sk_buff, data)), 3993 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 3994 offsetof(struct __sk_buff, data_end)), 3995 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 3996 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 3997 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 7), 3998 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_7, 4), 3999 BPF_MOV64_IMM(BPF_REG_2, 0), 4000 BPF_MOV64_IMM(BPF_REG_4, 42), 4001 BPF_MOV64_IMM(BPF_REG_5, 0), 4002 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4003 BPF_FUNC_skb_store_bytes), 4004 BPF_MOV64_IMM(BPF_REG_0, 0), 4005 BPF_EXIT_INSN(), 4006 }, 4007 .result = REJECT, 4008 .errstr = "helper access to the packet", 4009 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4010 }, 4011 { 4012 "helper access to packet: test12, cls unsuitable helper 2", 4013 .insns = { 4014 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4015 offsetof(struct __sk_buff, data)), 4016 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4017 offsetof(struct __sk_buff, data_end)), 4018 BPF_MOV64_REG(BPF_REG_3, BPF_REG_6), 4019 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 4020 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 3), 4021 BPF_MOV64_IMM(BPF_REG_2, 0), 4022 BPF_MOV64_IMM(BPF_REG_4, 4), 4023 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4024 BPF_FUNC_skb_load_bytes), 4025 BPF_MOV64_IMM(BPF_REG_0, 0), 4026 BPF_EXIT_INSN(), 4027 }, 4028 .result = REJECT, 4029 .errstr = "helper access to the packet", 4030 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4031 }, 4032 { 4033 "helper access to packet: test13, cls helper ok", 4034 .insns = { 4035 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4036 offsetof(struct __sk_buff, data)), 4037 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4038 offsetof(struct __sk_buff, data_end)), 4039 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4040 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4041 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4042 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4043 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4044 BPF_MOV64_IMM(BPF_REG_2, 4), 4045 BPF_MOV64_IMM(BPF_REG_3, 0), 4046 BPF_MOV64_IMM(BPF_REG_4, 0), 4047 BPF_MOV64_IMM(BPF_REG_5, 0), 4048 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4049 BPF_FUNC_csum_diff), 4050 BPF_MOV64_IMM(BPF_REG_0, 0), 4051 BPF_EXIT_INSN(), 4052 }, 4053 .result = ACCEPT, 4054 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4055 }, 4056 { 4057 "helper access to packet: test14, cls helper ok sub", 4058 .insns = { 4059 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4060 offsetof(struct __sk_buff, data)), 4061 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4062 offsetof(struct __sk_buff, data_end)), 4063 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4064 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4065 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4066 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4067 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 4), 4068 BPF_MOV64_IMM(BPF_REG_2, 4), 4069 BPF_MOV64_IMM(BPF_REG_3, 0), 4070 BPF_MOV64_IMM(BPF_REG_4, 0), 4071 BPF_MOV64_IMM(BPF_REG_5, 0), 4072 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4073 BPF_FUNC_csum_diff), 4074 BPF_MOV64_IMM(BPF_REG_0, 0), 4075 BPF_EXIT_INSN(), 4076 }, 4077 .result = ACCEPT, 4078 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4079 }, 4080 { 4081 "helper access to packet: test15, cls helper fail sub", 4082 .insns = { 4083 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4084 offsetof(struct __sk_buff, data)), 4085 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4086 offsetof(struct __sk_buff, data_end)), 4087 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4088 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4089 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4090 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4091 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 12), 4092 BPF_MOV64_IMM(BPF_REG_2, 4), 4093 BPF_MOV64_IMM(BPF_REG_3, 0), 4094 BPF_MOV64_IMM(BPF_REG_4, 0), 4095 BPF_MOV64_IMM(BPF_REG_5, 0), 4096 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4097 BPF_FUNC_csum_diff), 4098 BPF_MOV64_IMM(BPF_REG_0, 0), 4099 BPF_EXIT_INSN(), 4100 }, 4101 .result = REJECT, 4102 .errstr = "invalid access to packet", 4103 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4104 }, 4105 { 4106 "helper access to packet: test16, cls helper fail range 1", 4107 .insns = { 4108 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4109 offsetof(struct __sk_buff, data)), 4110 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4111 offsetof(struct __sk_buff, data_end)), 4112 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4113 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4114 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4115 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4116 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4117 BPF_MOV64_IMM(BPF_REG_2, 8), 4118 BPF_MOV64_IMM(BPF_REG_3, 0), 4119 BPF_MOV64_IMM(BPF_REG_4, 0), 4120 BPF_MOV64_IMM(BPF_REG_5, 0), 4121 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4122 BPF_FUNC_csum_diff), 4123 BPF_MOV64_IMM(BPF_REG_0, 0), 4124 BPF_EXIT_INSN(), 4125 }, 4126 .result = REJECT, 4127 .errstr = "invalid access to packet", 4128 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4129 }, 4130 { 4131 "helper access to packet: test17, cls helper fail range 2", 4132 .insns = { 4133 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4134 offsetof(struct __sk_buff, data)), 4135 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4136 offsetof(struct __sk_buff, data_end)), 4137 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4138 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4139 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4140 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4141 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4142 BPF_MOV64_IMM(BPF_REG_2, -9), 4143 BPF_MOV64_IMM(BPF_REG_3, 0), 4144 BPF_MOV64_IMM(BPF_REG_4, 0), 4145 BPF_MOV64_IMM(BPF_REG_5, 0), 4146 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4147 BPF_FUNC_csum_diff), 4148 BPF_MOV64_IMM(BPF_REG_0, 0), 4149 BPF_EXIT_INSN(), 4150 }, 4151 .result = REJECT, 4152 .errstr = "R2 min value is negative", 4153 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4154 }, 4155 { 4156 "helper access to packet: test18, cls helper fail range 3", 4157 .insns = { 4158 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4159 offsetof(struct __sk_buff, data)), 4160 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4161 offsetof(struct __sk_buff, data_end)), 4162 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4163 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4164 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4165 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4166 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4167 BPF_MOV64_IMM(BPF_REG_2, ~0), 4168 BPF_MOV64_IMM(BPF_REG_3, 0), 4169 BPF_MOV64_IMM(BPF_REG_4, 0), 4170 BPF_MOV64_IMM(BPF_REG_5, 0), 4171 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4172 BPF_FUNC_csum_diff), 4173 BPF_MOV64_IMM(BPF_REG_0, 0), 4174 BPF_EXIT_INSN(), 4175 }, 4176 .result = REJECT, 4177 .errstr = "R2 min value is negative", 4178 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4179 }, 4180 { 4181 "helper access to packet: test19, cls helper range zero", 4182 .insns = { 4183 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4184 offsetof(struct __sk_buff, data)), 4185 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4186 offsetof(struct __sk_buff, data_end)), 4187 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4188 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4189 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4190 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4191 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4192 BPF_MOV64_IMM(BPF_REG_2, 0), 4193 BPF_MOV64_IMM(BPF_REG_3, 0), 4194 BPF_MOV64_IMM(BPF_REG_4, 0), 4195 BPF_MOV64_IMM(BPF_REG_5, 0), 4196 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4197 BPF_FUNC_csum_diff), 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 "helper access to packet: test20, pkt end as input", 4206 .insns = { 4207 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4208 offsetof(struct __sk_buff, data)), 4209 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4210 offsetof(struct __sk_buff, data_end)), 4211 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4212 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4213 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4214 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4215 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 4216 BPF_MOV64_IMM(BPF_REG_2, 4), 4217 BPF_MOV64_IMM(BPF_REG_3, 0), 4218 BPF_MOV64_IMM(BPF_REG_4, 0), 4219 BPF_MOV64_IMM(BPF_REG_5, 0), 4220 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4221 BPF_FUNC_csum_diff), 4222 BPF_MOV64_IMM(BPF_REG_0, 0), 4223 BPF_EXIT_INSN(), 4224 }, 4225 .result = REJECT, 4226 .errstr = "R1 type=pkt_end expected=fp", 4227 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4228 }, 4229 { 4230 "helper access to packet: test21, wrong reg", 4231 .insns = { 4232 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 4233 offsetof(struct __sk_buff, data)), 4234 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 4235 offsetof(struct __sk_buff, data_end)), 4236 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 4237 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4238 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 7), 4239 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_7, 6), 4240 BPF_MOV64_IMM(BPF_REG_2, 4), 4241 BPF_MOV64_IMM(BPF_REG_3, 0), 4242 BPF_MOV64_IMM(BPF_REG_4, 0), 4243 BPF_MOV64_IMM(BPF_REG_5, 0), 4244 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4245 BPF_FUNC_csum_diff), 4246 BPF_MOV64_IMM(BPF_REG_0, 0), 4247 BPF_EXIT_INSN(), 4248 }, 4249 .result = REJECT, 4250 .errstr = "invalid access to packet", 4251 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4252 }, 4253 { 4254 "valid map access into an array with a constant", 4255 .insns = { 4256 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4257 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4258 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4259 BPF_LD_MAP_FD(BPF_REG_1, 0), 4260 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4261 BPF_FUNC_map_lookup_elem), 4262 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4263 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4264 offsetof(struct test_val, foo)), 4265 BPF_EXIT_INSN(), 4266 }, 4267 .fixup_map2 = { 3 }, 4268 .errstr_unpriv = "R0 leaks addr", 4269 .result_unpriv = REJECT, 4270 .result = ACCEPT, 4271 }, 4272 { 4273 "valid map access into an array with a register", 4274 .insns = { 4275 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4276 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4277 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4278 BPF_LD_MAP_FD(BPF_REG_1, 0), 4279 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4280 BPF_FUNC_map_lookup_elem), 4281 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4282 BPF_MOV64_IMM(BPF_REG_1, 4), 4283 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4284 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4285 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4286 offsetof(struct test_val, foo)), 4287 BPF_EXIT_INSN(), 4288 }, 4289 .fixup_map2 = { 3 }, 4290 .errstr_unpriv = "R0 leaks addr", 4291 .result_unpriv = REJECT, 4292 .result = ACCEPT, 4293 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4294 }, 4295 { 4296 "valid map access into an array with a variable", 4297 .insns = { 4298 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4299 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4300 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4301 BPF_LD_MAP_FD(BPF_REG_1, 0), 4302 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4303 BPF_FUNC_map_lookup_elem), 4304 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 4305 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4306 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 3), 4307 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4308 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4309 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4310 offsetof(struct test_val, foo)), 4311 BPF_EXIT_INSN(), 4312 }, 4313 .fixup_map2 = { 3 }, 4314 .errstr_unpriv = "R0 leaks addr", 4315 .result_unpriv = REJECT, 4316 .result = ACCEPT, 4317 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4318 }, 4319 { 4320 "valid map access into an array with a signed variable", 4321 .insns = { 4322 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4323 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4324 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4325 BPF_LD_MAP_FD(BPF_REG_1, 0), 4326 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4327 BPF_FUNC_map_lookup_elem), 4328 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 4329 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4330 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 0xffffffff, 1), 4331 BPF_MOV32_IMM(BPF_REG_1, 0), 4332 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 4333 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 4334 BPF_MOV32_IMM(BPF_REG_1, 0), 4335 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4336 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4337 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4338 offsetof(struct test_val, foo)), 4339 BPF_EXIT_INSN(), 4340 }, 4341 .fixup_map2 = { 3 }, 4342 .errstr_unpriv = "R0 leaks addr", 4343 .result_unpriv = REJECT, 4344 .result = ACCEPT, 4345 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4346 }, 4347 { 4348 "invalid map access into an array with a constant", 4349 .insns = { 4350 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4351 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4352 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4353 BPF_LD_MAP_FD(BPF_REG_1, 0), 4354 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4355 BPF_FUNC_map_lookup_elem), 4356 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4357 BPF_ST_MEM(BPF_DW, BPF_REG_0, (MAX_ENTRIES + 1) << 2, 4358 offsetof(struct test_val, foo)), 4359 BPF_EXIT_INSN(), 4360 }, 4361 .fixup_map2 = { 3 }, 4362 .errstr = "invalid access to map value, value_size=48 off=48 size=8", 4363 .result = REJECT, 4364 }, 4365 { 4366 "invalid map access into an array with a register", 4367 .insns = { 4368 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4369 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4370 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4371 BPF_LD_MAP_FD(BPF_REG_1, 0), 4372 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4373 BPF_FUNC_map_lookup_elem), 4374 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4375 BPF_MOV64_IMM(BPF_REG_1, MAX_ENTRIES + 1), 4376 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4377 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4378 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4379 offsetof(struct test_val, foo)), 4380 BPF_EXIT_INSN(), 4381 }, 4382 .fixup_map2 = { 3 }, 4383 .errstr = "R0 min value is outside of the array range", 4384 .result = REJECT, 4385 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4386 }, 4387 { 4388 "invalid map access into an array with a variable", 4389 .insns = { 4390 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4391 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4392 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4393 BPF_LD_MAP_FD(BPF_REG_1, 0), 4394 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4395 BPF_FUNC_map_lookup_elem), 4396 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4397 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4398 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4399 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4400 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4401 offsetof(struct test_val, foo)), 4402 BPF_EXIT_INSN(), 4403 }, 4404 .fixup_map2 = { 3 }, 4405 .errstr = "R0 unbounded memory access, make sure to bounds check any array access into a map", 4406 .result = REJECT, 4407 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4408 }, 4409 { 4410 "invalid map access into an array with no floor check", 4411 .insns = { 4412 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4413 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4414 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4415 BPF_LD_MAP_FD(BPF_REG_1, 0), 4416 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4417 BPF_FUNC_map_lookup_elem), 4418 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 4419 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 4420 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 4421 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 4422 BPF_MOV32_IMM(BPF_REG_1, 0), 4423 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4424 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4425 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4426 offsetof(struct test_val, foo)), 4427 BPF_EXIT_INSN(), 4428 }, 4429 .fixup_map2 = { 3 }, 4430 .errstr_unpriv = "R0 leaks addr", 4431 .errstr = "R0 unbounded memory access", 4432 .result_unpriv = REJECT, 4433 .result = REJECT, 4434 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4435 }, 4436 { 4437 "invalid map access into an array with a invalid max check", 4438 .insns = { 4439 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4440 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4441 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4442 BPF_LD_MAP_FD(BPF_REG_1, 0), 4443 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4444 BPF_FUNC_map_lookup_elem), 4445 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 4446 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4447 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES + 1), 4448 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 4449 BPF_MOV32_IMM(BPF_REG_1, 0), 4450 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 4451 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4452 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 4453 offsetof(struct test_val, foo)), 4454 BPF_EXIT_INSN(), 4455 }, 4456 .fixup_map2 = { 3 }, 4457 .errstr_unpriv = "R0 leaks addr", 4458 .errstr = "invalid access to map value, value_size=48 off=44 size=8", 4459 .result_unpriv = REJECT, 4460 .result = REJECT, 4461 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4462 }, 4463 { 4464 "invalid map access into an array with a invalid max check", 4465 .insns = { 4466 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4467 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4468 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4469 BPF_LD_MAP_FD(BPF_REG_1, 0), 4470 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4471 BPF_FUNC_map_lookup_elem), 4472 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 4473 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 4474 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4475 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4476 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4477 BPF_LD_MAP_FD(BPF_REG_1, 0), 4478 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4479 BPF_FUNC_map_lookup_elem), 4480 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 4481 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 4482 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 4483 offsetof(struct test_val, foo)), 4484 BPF_EXIT_INSN(), 4485 }, 4486 .fixup_map2 = { 3, 11 }, 4487 .errstr = "R0 pointer += pointer", 4488 .result = REJECT, 4489 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4490 }, 4491 { 4492 "multiple registers share map_lookup_elem result", 4493 .insns = { 4494 BPF_MOV64_IMM(BPF_REG_1, 10), 4495 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4496 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4497 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4498 BPF_LD_MAP_FD(BPF_REG_1, 0), 4499 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4500 BPF_FUNC_map_lookup_elem), 4501 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4502 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4503 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4504 BPF_EXIT_INSN(), 4505 }, 4506 .fixup_map1 = { 4 }, 4507 .result = ACCEPT, 4508 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4509 }, 4510 { 4511 "alu ops on ptr_to_map_value_or_null, 1", 4512 .insns = { 4513 BPF_MOV64_IMM(BPF_REG_1, 10), 4514 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4515 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4516 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4517 BPF_LD_MAP_FD(BPF_REG_1, 0), 4518 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4519 BPF_FUNC_map_lookup_elem), 4520 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4521 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -2), 4522 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 2), 4523 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4524 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4525 BPF_EXIT_INSN(), 4526 }, 4527 .fixup_map1 = { 4 }, 4528 .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", 4529 .result = REJECT, 4530 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4531 }, 4532 { 4533 "alu ops on ptr_to_map_value_or_null, 2", 4534 .insns = { 4535 BPF_MOV64_IMM(BPF_REG_1, 10), 4536 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4537 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4538 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4539 BPF_LD_MAP_FD(BPF_REG_1, 0), 4540 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4541 BPF_FUNC_map_lookup_elem), 4542 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4543 BPF_ALU64_IMM(BPF_AND, BPF_REG_4, -1), 4544 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4545 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4546 BPF_EXIT_INSN(), 4547 }, 4548 .fixup_map1 = { 4 }, 4549 .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", 4550 .result = REJECT, 4551 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4552 }, 4553 { 4554 "alu ops on ptr_to_map_value_or_null, 3", 4555 .insns = { 4556 BPF_MOV64_IMM(BPF_REG_1, 10), 4557 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4558 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4559 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4560 BPF_LD_MAP_FD(BPF_REG_1, 0), 4561 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4562 BPF_FUNC_map_lookup_elem), 4563 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4564 BPF_ALU64_IMM(BPF_LSH, BPF_REG_4, 1), 4565 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4566 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4567 BPF_EXIT_INSN(), 4568 }, 4569 .fixup_map1 = { 4 }, 4570 .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", 4571 .result = REJECT, 4572 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4573 }, 4574 { 4575 "invalid memory access with multiple map_lookup_elem calls", 4576 .insns = { 4577 BPF_MOV64_IMM(BPF_REG_1, 10), 4578 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4579 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4580 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4581 BPF_LD_MAP_FD(BPF_REG_1, 0), 4582 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 4583 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 4584 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4585 BPF_FUNC_map_lookup_elem), 4586 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4587 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 4588 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 4589 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4590 BPF_FUNC_map_lookup_elem), 4591 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4592 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4593 BPF_EXIT_INSN(), 4594 }, 4595 .fixup_map1 = { 4 }, 4596 .result = REJECT, 4597 .errstr = "R4 !read_ok", 4598 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4599 }, 4600 { 4601 "valid indirect map_lookup_elem access with 2nd lookup in branch", 4602 .insns = { 4603 BPF_MOV64_IMM(BPF_REG_1, 10), 4604 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_1, -8), 4605 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4606 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4607 BPF_LD_MAP_FD(BPF_REG_1, 0), 4608 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 4609 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 4610 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4611 BPF_FUNC_map_lookup_elem), 4612 BPF_MOV64_IMM(BPF_REG_2, 10), 4613 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 3), 4614 BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 4615 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 4616 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4617 BPF_FUNC_map_lookup_elem), 4618 BPF_MOV64_REG(BPF_REG_4, BPF_REG_0), 4619 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4620 BPF_ST_MEM(BPF_DW, BPF_REG_4, 0, 0), 4621 BPF_EXIT_INSN(), 4622 }, 4623 .fixup_map1 = { 4 }, 4624 .result = ACCEPT, 4625 .prog_type = BPF_PROG_TYPE_SCHED_CLS 4626 }, 4627 { 4628 "invalid map access from else condition", 4629 .insns = { 4630 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4631 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4632 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4633 BPF_LD_MAP_FD(BPF_REG_1, 0), 4634 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 4635 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 4636 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 4637 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES-1, 1), 4638 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 4639 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 4640 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 4641 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, offsetof(struct test_val, foo)), 4642 BPF_EXIT_INSN(), 4643 }, 4644 .fixup_map2 = { 3 }, 4645 .errstr = "R0 unbounded memory access", 4646 .result = REJECT, 4647 .errstr_unpriv = "R0 leaks addr", 4648 .result_unpriv = REJECT, 4649 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 4650 }, 4651 { 4652 "constant register |= constant should keep constant type", 4653 .insns = { 4654 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 4655 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 4656 BPF_MOV64_IMM(BPF_REG_2, 34), 4657 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 13), 4658 BPF_MOV64_IMM(BPF_REG_3, 0), 4659 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4660 BPF_EXIT_INSN(), 4661 }, 4662 .result = ACCEPT, 4663 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4664 }, 4665 { 4666 "constant register |= constant should not bypass stack boundary checks", 4667 .insns = { 4668 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 4669 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 4670 BPF_MOV64_IMM(BPF_REG_2, 34), 4671 BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 24), 4672 BPF_MOV64_IMM(BPF_REG_3, 0), 4673 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4674 BPF_EXIT_INSN(), 4675 }, 4676 .errstr = "invalid stack type R1 off=-48 access_size=58", 4677 .result = REJECT, 4678 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4679 }, 4680 { 4681 "constant register |= constant register should keep constant type", 4682 .insns = { 4683 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 4684 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 4685 BPF_MOV64_IMM(BPF_REG_2, 34), 4686 BPF_MOV64_IMM(BPF_REG_4, 13), 4687 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 4688 BPF_MOV64_IMM(BPF_REG_3, 0), 4689 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4690 BPF_EXIT_INSN(), 4691 }, 4692 .result = ACCEPT, 4693 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4694 }, 4695 { 4696 "constant register |= constant register should not bypass stack boundary checks", 4697 .insns = { 4698 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 4699 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -48), 4700 BPF_MOV64_IMM(BPF_REG_2, 34), 4701 BPF_MOV64_IMM(BPF_REG_4, 24), 4702 BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_4), 4703 BPF_MOV64_IMM(BPF_REG_3, 0), 4704 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4705 BPF_EXIT_INSN(), 4706 }, 4707 .errstr = "invalid stack type R1 off=-48 access_size=58", 4708 .result = REJECT, 4709 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4710 }, 4711 { 4712 "invalid direct packet write for LWT_IN", 4713 .insns = { 4714 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4715 offsetof(struct __sk_buff, data)), 4716 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4717 offsetof(struct __sk_buff, data_end)), 4718 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4719 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4720 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4721 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4722 BPF_MOV64_IMM(BPF_REG_0, 0), 4723 BPF_EXIT_INSN(), 4724 }, 4725 .errstr = "cannot write into packet", 4726 .result = REJECT, 4727 .prog_type = BPF_PROG_TYPE_LWT_IN, 4728 }, 4729 { 4730 "invalid direct packet write for LWT_OUT", 4731 .insns = { 4732 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4733 offsetof(struct __sk_buff, data)), 4734 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4735 offsetof(struct __sk_buff, data_end)), 4736 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4737 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4738 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4739 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4740 BPF_MOV64_IMM(BPF_REG_0, 0), 4741 BPF_EXIT_INSN(), 4742 }, 4743 .errstr = "cannot write into packet", 4744 .result = REJECT, 4745 .prog_type = BPF_PROG_TYPE_LWT_OUT, 4746 }, 4747 { 4748 "direct packet write for LWT_XMIT", 4749 .insns = { 4750 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4751 offsetof(struct __sk_buff, data)), 4752 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4753 offsetof(struct __sk_buff, data_end)), 4754 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4755 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4756 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4757 BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 4758 BPF_MOV64_IMM(BPF_REG_0, 0), 4759 BPF_EXIT_INSN(), 4760 }, 4761 .result = ACCEPT, 4762 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 4763 }, 4764 { 4765 "direct packet read for LWT_IN", 4766 .insns = { 4767 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4768 offsetof(struct __sk_buff, data)), 4769 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4770 offsetof(struct __sk_buff, data_end)), 4771 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4772 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4773 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4774 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4775 BPF_MOV64_IMM(BPF_REG_0, 0), 4776 BPF_EXIT_INSN(), 4777 }, 4778 .result = ACCEPT, 4779 .prog_type = BPF_PROG_TYPE_LWT_IN, 4780 }, 4781 { 4782 "direct packet read for LWT_OUT", 4783 .insns = { 4784 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4785 offsetof(struct __sk_buff, data)), 4786 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4787 offsetof(struct __sk_buff, data_end)), 4788 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4789 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4790 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4791 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4792 BPF_MOV64_IMM(BPF_REG_0, 0), 4793 BPF_EXIT_INSN(), 4794 }, 4795 .result = ACCEPT, 4796 .prog_type = BPF_PROG_TYPE_LWT_OUT, 4797 }, 4798 { 4799 "direct packet read for LWT_XMIT", 4800 .insns = { 4801 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4802 offsetof(struct __sk_buff, data)), 4803 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4804 offsetof(struct __sk_buff, data_end)), 4805 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4806 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4807 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 4808 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 4809 BPF_MOV64_IMM(BPF_REG_0, 0), 4810 BPF_EXIT_INSN(), 4811 }, 4812 .result = ACCEPT, 4813 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 4814 }, 4815 { 4816 "overlapping checks for direct packet access", 4817 .insns = { 4818 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4819 offsetof(struct __sk_buff, data)), 4820 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 4821 offsetof(struct __sk_buff, data_end)), 4822 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 4823 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 4824 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4), 4825 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 4826 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6), 4827 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 4828 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6), 4829 BPF_MOV64_IMM(BPF_REG_0, 0), 4830 BPF_EXIT_INSN(), 4831 }, 4832 .result = ACCEPT, 4833 .prog_type = BPF_PROG_TYPE_LWT_XMIT, 4834 }, 4835 { 4836 "invalid access of tc_classid for LWT_IN", 4837 .insns = { 4838 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 4839 offsetof(struct __sk_buff, tc_classid)), 4840 BPF_EXIT_INSN(), 4841 }, 4842 .result = REJECT, 4843 .errstr = "invalid bpf_context access", 4844 }, 4845 { 4846 "invalid access of tc_classid for LWT_OUT", 4847 .insns = { 4848 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 4849 offsetof(struct __sk_buff, tc_classid)), 4850 BPF_EXIT_INSN(), 4851 }, 4852 .result = REJECT, 4853 .errstr = "invalid bpf_context access", 4854 }, 4855 { 4856 "invalid access of tc_classid for LWT_XMIT", 4857 .insns = { 4858 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 4859 offsetof(struct __sk_buff, tc_classid)), 4860 BPF_EXIT_INSN(), 4861 }, 4862 .result = REJECT, 4863 .errstr = "invalid bpf_context access", 4864 }, 4865 { 4866 "leak pointer into ctx 1", 4867 .insns = { 4868 BPF_MOV64_IMM(BPF_REG_0, 0), 4869 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 4870 offsetof(struct __sk_buff, cb[0])), 4871 BPF_LD_MAP_FD(BPF_REG_2, 0), 4872 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_2, 4873 offsetof(struct __sk_buff, cb[0])), 4874 BPF_EXIT_INSN(), 4875 }, 4876 .fixup_map1 = { 2 }, 4877 .errstr_unpriv = "R2 leaks addr into mem", 4878 .result_unpriv = REJECT, 4879 .result = REJECT, 4880 .errstr = "BPF_XADD stores into R1 context is not allowed", 4881 }, 4882 { 4883 "leak pointer into ctx 2", 4884 .insns = { 4885 BPF_MOV64_IMM(BPF_REG_0, 0), 4886 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 4887 offsetof(struct __sk_buff, cb[0])), 4888 BPF_STX_XADD(BPF_DW, BPF_REG_1, BPF_REG_10, 4889 offsetof(struct __sk_buff, cb[0])), 4890 BPF_EXIT_INSN(), 4891 }, 4892 .errstr_unpriv = "R10 leaks addr into mem", 4893 .result_unpriv = REJECT, 4894 .result = REJECT, 4895 .errstr = "BPF_XADD stores into R1 context is not allowed", 4896 }, 4897 { 4898 "leak pointer into ctx 3", 4899 .insns = { 4900 BPF_MOV64_IMM(BPF_REG_0, 0), 4901 BPF_LD_MAP_FD(BPF_REG_2, 0), 4902 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 4903 offsetof(struct __sk_buff, cb[0])), 4904 BPF_EXIT_INSN(), 4905 }, 4906 .fixup_map1 = { 1 }, 4907 .errstr_unpriv = "R2 leaks addr into ctx", 4908 .result_unpriv = REJECT, 4909 .result = ACCEPT, 4910 }, 4911 { 4912 "leak pointer into map val", 4913 .insns = { 4914 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 4915 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 4916 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4918 BPF_LD_MAP_FD(BPF_REG_1, 0), 4919 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 4920 BPF_FUNC_map_lookup_elem), 4921 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 4922 BPF_MOV64_IMM(BPF_REG_3, 0), 4923 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 4924 BPF_STX_XADD(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 4925 BPF_MOV64_IMM(BPF_REG_0, 0), 4926 BPF_EXIT_INSN(), 4927 }, 4928 .fixup_map1 = { 4 }, 4929 .errstr_unpriv = "R6 leaks addr into mem", 4930 .result_unpriv = REJECT, 4931 .result = ACCEPT, 4932 }, 4933 { 4934 "helper access to map: full range", 4935 .insns = { 4936 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4937 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4938 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 4939 BPF_LD_MAP_FD(BPF_REG_1, 0), 4940 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 4941 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4942 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 4943 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 4944 BPF_MOV64_IMM(BPF_REG_3, 0), 4945 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4946 BPF_EXIT_INSN(), 4947 }, 4948 .fixup_map2 = { 3 }, 4949 .result = ACCEPT, 4950 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4951 }, 4952 { 4953 "helper access to map: partial range", 4954 .insns = { 4955 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4956 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4957 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 4958 BPF_LD_MAP_FD(BPF_REG_1, 0), 4959 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 4960 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4961 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 4962 BPF_MOV64_IMM(BPF_REG_2, 8), 4963 BPF_MOV64_IMM(BPF_REG_3, 0), 4964 BPF_EMIT_CALL(BPF_FUNC_probe_read), 4965 BPF_EXIT_INSN(), 4966 }, 4967 .fixup_map2 = { 3 }, 4968 .result = ACCEPT, 4969 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4970 }, 4971 { 4972 "helper access to map: empty range", 4973 .insns = { 4974 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4976 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 4977 BPF_LD_MAP_FD(BPF_REG_1, 0), 4978 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 4979 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 4980 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 4981 BPF_MOV64_IMM(BPF_REG_2, 0), 4982 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 4983 BPF_EXIT_INSN(), 4984 }, 4985 .fixup_map2 = { 3 }, 4986 .errstr = "invalid access to map value, value_size=48 off=0 size=0", 4987 .result = REJECT, 4988 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 4989 }, 4990 { 4991 "helper access to map: out-of-bound range", 4992 .insns = { 4993 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4994 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 4995 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 4996 BPF_LD_MAP_FD(BPF_REG_1, 0), 4997 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 4998 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 4999 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5000 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val) + 8), 5001 BPF_MOV64_IMM(BPF_REG_3, 0), 5002 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5003 BPF_EXIT_INSN(), 5004 }, 5005 .fixup_map2 = { 3 }, 5006 .errstr = "invalid access to map value, value_size=48 off=0 size=56", 5007 .result = REJECT, 5008 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5009 }, 5010 { 5011 "helper access to map: negative range", 5012 .insns = { 5013 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5014 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5015 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5016 BPF_LD_MAP_FD(BPF_REG_1, 0), 5017 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5018 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5019 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5020 BPF_MOV64_IMM(BPF_REG_2, -8), 5021 BPF_MOV64_IMM(BPF_REG_3, 0), 5022 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5023 BPF_EXIT_INSN(), 5024 }, 5025 .fixup_map2 = { 3 }, 5026 .errstr = "R2 min value is negative", 5027 .result = REJECT, 5028 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5029 }, 5030 { 5031 "helper access to adjusted map (via const imm): full range", 5032 .insns = { 5033 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5034 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5035 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5036 BPF_LD_MAP_FD(BPF_REG_1, 0), 5037 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5038 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5039 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5040 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5041 offsetof(struct test_val, foo)), 5042 BPF_MOV64_IMM(BPF_REG_2, 5043 sizeof(struct test_val) - 5044 offsetof(struct test_val, foo)), 5045 BPF_MOV64_IMM(BPF_REG_3, 0), 5046 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5047 BPF_EXIT_INSN(), 5048 }, 5049 .fixup_map2 = { 3 }, 5050 .result = ACCEPT, 5051 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5052 }, 5053 { 5054 "helper access to adjusted map (via const imm): partial range", 5055 .insns = { 5056 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5057 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5058 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5059 BPF_LD_MAP_FD(BPF_REG_1, 0), 5060 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5061 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5062 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5063 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5064 offsetof(struct test_val, foo)), 5065 BPF_MOV64_IMM(BPF_REG_2, 8), 5066 BPF_MOV64_IMM(BPF_REG_3, 0), 5067 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5068 BPF_EXIT_INSN(), 5069 }, 5070 .fixup_map2 = { 3 }, 5071 .result = ACCEPT, 5072 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5073 }, 5074 { 5075 "helper access to adjusted map (via const imm): empty range", 5076 .insns = { 5077 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5078 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5079 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5080 BPF_LD_MAP_FD(BPF_REG_1, 0), 5081 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5082 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5083 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5084 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5085 offsetof(struct test_val, foo)), 5086 BPF_MOV64_IMM(BPF_REG_2, 0), 5087 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 5088 BPF_EXIT_INSN(), 5089 }, 5090 .fixup_map2 = { 3 }, 5091 .errstr = "invalid access to map value, value_size=48 off=4 size=0", 5092 .result = REJECT, 5093 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5094 }, 5095 { 5096 "helper access to adjusted map (via const imm): out-of-bound range", 5097 .insns = { 5098 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5099 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5100 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5101 BPF_LD_MAP_FD(BPF_REG_1, 0), 5102 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5103 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5104 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5105 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5106 offsetof(struct test_val, foo)), 5107 BPF_MOV64_IMM(BPF_REG_2, 5108 sizeof(struct test_val) - 5109 offsetof(struct test_val, foo) + 8), 5110 BPF_MOV64_IMM(BPF_REG_3, 0), 5111 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5112 BPF_EXIT_INSN(), 5113 }, 5114 .fixup_map2 = { 3 }, 5115 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 5116 .result = REJECT, 5117 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5118 }, 5119 { 5120 "helper access to adjusted map (via const imm): negative range (> adjustment)", 5121 .insns = { 5122 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5123 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5124 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5125 BPF_LD_MAP_FD(BPF_REG_1, 0), 5126 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5127 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5128 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5129 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5130 offsetof(struct test_val, foo)), 5131 BPF_MOV64_IMM(BPF_REG_2, -8), 5132 BPF_MOV64_IMM(BPF_REG_3, 0), 5133 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5134 BPF_EXIT_INSN(), 5135 }, 5136 .fixup_map2 = { 3 }, 5137 .errstr = "R2 min value is negative", 5138 .result = REJECT, 5139 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5140 }, 5141 { 5142 "helper access to adjusted map (via const imm): negative range (< adjustment)", 5143 .insns = { 5144 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5145 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5146 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5147 BPF_LD_MAP_FD(BPF_REG_1, 0), 5148 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5149 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5150 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5151 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 5152 offsetof(struct test_val, foo)), 5153 BPF_MOV64_IMM(BPF_REG_2, -1), 5154 BPF_MOV64_IMM(BPF_REG_3, 0), 5155 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5156 BPF_EXIT_INSN(), 5157 }, 5158 .fixup_map2 = { 3 }, 5159 .errstr = "R2 min value is negative", 5160 .result = REJECT, 5161 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5162 }, 5163 { 5164 "helper access to adjusted map (via const reg): full range", 5165 .insns = { 5166 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5167 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5168 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5169 BPF_LD_MAP_FD(BPF_REG_1, 0), 5170 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5171 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5172 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5173 BPF_MOV64_IMM(BPF_REG_3, 5174 offsetof(struct test_val, foo)), 5175 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5176 BPF_MOV64_IMM(BPF_REG_2, 5177 sizeof(struct test_val) - 5178 offsetof(struct test_val, foo)), 5179 BPF_MOV64_IMM(BPF_REG_3, 0), 5180 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5181 BPF_EXIT_INSN(), 5182 }, 5183 .fixup_map2 = { 3 }, 5184 .result = ACCEPT, 5185 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5186 }, 5187 { 5188 "helper access to adjusted map (via const reg): partial range", 5189 .insns = { 5190 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5191 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5192 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5193 BPF_LD_MAP_FD(BPF_REG_1, 0), 5194 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5195 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5196 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5197 BPF_MOV64_IMM(BPF_REG_3, 5198 offsetof(struct test_val, foo)), 5199 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5200 BPF_MOV64_IMM(BPF_REG_2, 8), 5201 BPF_MOV64_IMM(BPF_REG_3, 0), 5202 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5203 BPF_EXIT_INSN(), 5204 }, 5205 .fixup_map2 = { 3 }, 5206 .result = ACCEPT, 5207 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5208 }, 5209 { 5210 "helper access to adjusted map (via const reg): empty range", 5211 .insns = { 5212 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5213 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5214 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5215 BPF_LD_MAP_FD(BPF_REG_1, 0), 5216 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5217 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5218 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5219 BPF_MOV64_IMM(BPF_REG_3, 0), 5220 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5221 BPF_MOV64_IMM(BPF_REG_2, 0), 5222 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 5223 BPF_EXIT_INSN(), 5224 }, 5225 .fixup_map2 = { 3 }, 5226 .errstr = "R1 min value is outside of the array range", 5227 .result = REJECT, 5228 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5229 }, 5230 { 5231 "helper access to adjusted map (via const reg): out-of-bound range", 5232 .insns = { 5233 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5234 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5235 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5236 BPF_LD_MAP_FD(BPF_REG_1, 0), 5237 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5238 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5239 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5240 BPF_MOV64_IMM(BPF_REG_3, 5241 offsetof(struct test_val, foo)), 5242 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5243 BPF_MOV64_IMM(BPF_REG_2, 5244 sizeof(struct test_val) - 5245 offsetof(struct test_val, foo) + 8), 5246 BPF_MOV64_IMM(BPF_REG_3, 0), 5247 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5248 BPF_EXIT_INSN(), 5249 }, 5250 .fixup_map2 = { 3 }, 5251 .errstr = "invalid access to map value, value_size=48 off=4 size=52", 5252 .result = REJECT, 5253 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5254 }, 5255 { 5256 "helper access to adjusted map (via const reg): negative range (> adjustment)", 5257 .insns = { 5258 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5259 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5260 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5261 BPF_LD_MAP_FD(BPF_REG_1, 0), 5262 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5263 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5264 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5265 BPF_MOV64_IMM(BPF_REG_3, 5266 offsetof(struct test_val, foo)), 5267 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5268 BPF_MOV64_IMM(BPF_REG_2, -8), 5269 BPF_MOV64_IMM(BPF_REG_3, 0), 5270 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5271 BPF_EXIT_INSN(), 5272 }, 5273 .fixup_map2 = { 3 }, 5274 .errstr = "R2 min value is negative", 5275 .result = REJECT, 5276 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5277 }, 5278 { 5279 "helper access to adjusted map (via const reg): negative range (< adjustment)", 5280 .insns = { 5281 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5282 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5283 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5284 BPF_LD_MAP_FD(BPF_REG_1, 0), 5285 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5286 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5287 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5288 BPF_MOV64_IMM(BPF_REG_3, 5289 offsetof(struct test_val, foo)), 5290 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5291 BPF_MOV64_IMM(BPF_REG_2, -1), 5292 BPF_MOV64_IMM(BPF_REG_3, 0), 5293 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5294 BPF_EXIT_INSN(), 5295 }, 5296 .fixup_map2 = { 3 }, 5297 .errstr = "R2 min value is negative", 5298 .result = REJECT, 5299 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5300 }, 5301 { 5302 "helper access to adjusted map (via variable): full range", 5303 .insns = { 5304 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5305 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5306 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5307 BPF_LD_MAP_FD(BPF_REG_1, 0), 5308 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5309 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5310 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5311 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5312 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5313 offsetof(struct test_val, foo), 4), 5314 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5315 BPF_MOV64_IMM(BPF_REG_2, 5316 sizeof(struct test_val) - 5317 offsetof(struct test_val, foo)), 5318 BPF_MOV64_IMM(BPF_REG_3, 0), 5319 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5320 BPF_EXIT_INSN(), 5321 }, 5322 .fixup_map2 = { 3 }, 5323 .result = ACCEPT, 5324 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5325 }, 5326 { 5327 "helper access to adjusted map (via variable): partial range", 5328 .insns = { 5329 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5330 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5331 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5332 BPF_LD_MAP_FD(BPF_REG_1, 0), 5333 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5334 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5335 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5336 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5337 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5338 offsetof(struct test_val, foo), 4), 5339 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5340 BPF_MOV64_IMM(BPF_REG_2, 8), 5341 BPF_MOV64_IMM(BPF_REG_3, 0), 5342 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5343 BPF_EXIT_INSN(), 5344 }, 5345 .fixup_map2 = { 3 }, 5346 .result = ACCEPT, 5347 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5348 }, 5349 { 5350 "helper access to adjusted map (via variable): empty range", 5351 .insns = { 5352 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5353 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5354 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5355 BPF_LD_MAP_FD(BPF_REG_1, 0), 5356 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5357 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5358 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5359 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5360 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5361 offsetof(struct test_val, foo), 3), 5362 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5363 BPF_MOV64_IMM(BPF_REG_2, 0), 5364 BPF_EMIT_CALL(BPF_FUNC_trace_printk), 5365 BPF_EXIT_INSN(), 5366 }, 5367 .fixup_map2 = { 3 }, 5368 .errstr = "R1 min value is outside of the array range", 5369 .result = REJECT, 5370 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5371 }, 5372 { 5373 "helper access to adjusted map (via variable): no max check", 5374 .insns = { 5375 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5376 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5377 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5378 BPF_LD_MAP_FD(BPF_REG_1, 0), 5379 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5380 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5381 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5382 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5383 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5384 BPF_MOV64_IMM(BPF_REG_2, 1), 5385 BPF_MOV64_IMM(BPF_REG_3, 0), 5386 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5387 BPF_EXIT_INSN(), 5388 }, 5389 .fixup_map2 = { 3 }, 5390 .errstr = "R1 unbounded memory access", 5391 .result = REJECT, 5392 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5393 }, 5394 { 5395 "helper access to adjusted map (via variable): wrong max check", 5396 .insns = { 5397 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5398 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5399 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5400 BPF_LD_MAP_FD(BPF_REG_1, 0), 5401 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5402 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5403 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5404 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5405 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5406 offsetof(struct test_val, foo), 4), 5407 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5408 BPF_MOV64_IMM(BPF_REG_2, 5409 sizeof(struct test_val) - 5410 offsetof(struct test_val, foo) + 1), 5411 BPF_MOV64_IMM(BPF_REG_3, 0), 5412 BPF_EMIT_CALL(BPF_FUNC_probe_read), 5413 BPF_EXIT_INSN(), 5414 }, 5415 .fixup_map2 = { 3 }, 5416 .errstr = "invalid access to map value, value_size=48 off=4 size=45", 5417 .result = REJECT, 5418 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5419 }, 5420 { 5421 "helper access to map: bounds check using <, good access", 5422 .insns = { 5423 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5424 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5425 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5426 BPF_LD_MAP_FD(BPF_REG_1, 0), 5427 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5428 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5429 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5430 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5431 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 2), 5432 BPF_MOV64_IMM(BPF_REG_0, 0), 5433 BPF_EXIT_INSN(), 5434 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5435 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5436 BPF_MOV64_IMM(BPF_REG_0, 0), 5437 BPF_EXIT_INSN(), 5438 }, 5439 .fixup_map2 = { 3 }, 5440 .result = ACCEPT, 5441 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5442 }, 5443 { 5444 "helper access to map: bounds check using <, bad access", 5445 .insns = { 5446 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5447 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5448 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5449 BPF_LD_MAP_FD(BPF_REG_1, 0), 5450 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5451 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5452 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5453 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5454 BPF_JMP_IMM(BPF_JLT, BPF_REG_3, 32, 4), 5455 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5456 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5457 BPF_MOV64_IMM(BPF_REG_0, 0), 5458 BPF_EXIT_INSN(), 5459 BPF_MOV64_IMM(BPF_REG_0, 0), 5460 BPF_EXIT_INSN(), 5461 }, 5462 .fixup_map2 = { 3 }, 5463 .result = REJECT, 5464 .errstr = "R1 unbounded memory access", 5465 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5466 }, 5467 { 5468 "helper access to map: bounds check using <=, good access", 5469 .insns = { 5470 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5471 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5472 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5473 BPF_LD_MAP_FD(BPF_REG_1, 0), 5474 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5475 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5476 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5477 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5478 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 2), 5479 BPF_MOV64_IMM(BPF_REG_0, 0), 5480 BPF_EXIT_INSN(), 5481 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5482 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5483 BPF_MOV64_IMM(BPF_REG_0, 0), 5484 BPF_EXIT_INSN(), 5485 }, 5486 .fixup_map2 = { 3 }, 5487 .result = ACCEPT, 5488 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5489 }, 5490 { 5491 "helper access to map: bounds check using <=, bad access", 5492 .insns = { 5493 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5494 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5495 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5496 BPF_LD_MAP_FD(BPF_REG_1, 0), 5497 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5498 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5499 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5500 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5501 BPF_JMP_IMM(BPF_JLE, BPF_REG_3, 32, 4), 5502 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5503 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5504 BPF_MOV64_IMM(BPF_REG_0, 0), 5505 BPF_EXIT_INSN(), 5506 BPF_MOV64_IMM(BPF_REG_0, 0), 5507 BPF_EXIT_INSN(), 5508 }, 5509 .fixup_map2 = { 3 }, 5510 .result = REJECT, 5511 .errstr = "R1 unbounded memory access", 5512 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5513 }, 5514 { 5515 "helper access to map: bounds check using s<, good access", 5516 .insns = { 5517 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5518 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5519 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5520 BPF_LD_MAP_FD(BPF_REG_1, 0), 5521 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5522 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5523 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5524 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5525 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 5526 BPF_MOV64_IMM(BPF_REG_0, 0), 5527 BPF_EXIT_INSN(), 5528 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 0, -3), 5529 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5530 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5531 BPF_MOV64_IMM(BPF_REG_0, 0), 5532 BPF_EXIT_INSN(), 5533 }, 5534 .fixup_map2 = { 3 }, 5535 .result = ACCEPT, 5536 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5537 }, 5538 { 5539 "helper access to map: bounds check using s<, good access 2", 5540 .insns = { 5541 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5542 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5543 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5544 BPF_LD_MAP_FD(BPF_REG_1, 0), 5545 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5546 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5547 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5548 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5549 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 5550 BPF_MOV64_IMM(BPF_REG_0, 0), 5551 BPF_EXIT_INSN(), 5552 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 5553 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5554 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5555 BPF_MOV64_IMM(BPF_REG_0, 0), 5556 BPF_EXIT_INSN(), 5557 }, 5558 .fixup_map2 = { 3 }, 5559 .result = ACCEPT, 5560 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5561 }, 5562 { 5563 "helper access to map: bounds check using s<, bad access", 5564 .insns = { 5565 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5566 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5567 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5568 BPF_LD_MAP_FD(BPF_REG_1, 0), 5569 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5570 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5571 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5572 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 5573 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, 32, 2), 5574 BPF_MOV64_IMM(BPF_REG_0, 0), 5575 BPF_EXIT_INSN(), 5576 BPF_JMP_IMM(BPF_JSLT, BPF_REG_3, -3, -3), 5577 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5578 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5579 BPF_MOV64_IMM(BPF_REG_0, 0), 5580 BPF_EXIT_INSN(), 5581 }, 5582 .fixup_map2 = { 3 }, 5583 .result = REJECT, 5584 .errstr = "R1 min value is negative", 5585 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5586 }, 5587 { 5588 "helper access to map: bounds check using s<=, good access", 5589 .insns = { 5590 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5591 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5592 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5593 BPF_LD_MAP_FD(BPF_REG_1, 0), 5594 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5595 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5596 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5597 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5598 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 5599 BPF_MOV64_IMM(BPF_REG_0, 0), 5600 BPF_EXIT_INSN(), 5601 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 0, -3), 5602 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5603 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5604 BPF_MOV64_IMM(BPF_REG_0, 0), 5605 BPF_EXIT_INSN(), 5606 }, 5607 .fixup_map2 = { 3 }, 5608 .result = ACCEPT, 5609 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5610 }, 5611 { 5612 "helper access to map: bounds check using s<=, good access 2", 5613 .insns = { 5614 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5615 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5616 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5617 BPF_LD_MAP_FD(BPF_REG_1, 0), 5618 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5619 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5620 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5621 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5622 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 5623 BPF_MOV64_IMM(BPF_REG_0, 0), 5624 BPF_EXIT_INSN(), 5625 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 5626 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5627 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5628 BPF_MOV64_IMM(BPF_REG_0, 0), 5629 BPF_EXIT_INSN(), 5630 }, 5631 .fixup_map2 = { 3 }, 5632 .result = ACCEPT, 5633 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5634 }, 5635 { 5636 "helper access to map: bounds check using s<=, bad access", 5637 .insns = { 5638 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5639 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5640 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5641 BPF_LD_MAP_FD(BPF_REG_1, 0), 5642 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5643 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5644 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 5645 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 5646 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, 32, 2), 5647 BPF_MOV64_IMM(BPF_REG_0, 0), 5648 BPF_EXIT_INSN(), 5649 BPF_JMP_IMM(BPF_JSLE, BPF_REG_3, -3, -3), 5650 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_3), 5651 BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 0), 5652 BPF_MOV64_IMM(BPF_REG_0, 0), 5653 BPF_EXIT_INSN(), 5654 }, 5655 .fixup_map2 = { 3 }, 5656 .result = REJECT, 5657 .errstr = "R1 min value is negative", 5658 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5659 }, 5660 { 5661 "map lookup helper access to map", 5662 .insns = { 5663 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5665 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5666 BPF_LD_MAP_FD(BPF_REG_1, 0), 5667 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5668 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 5669 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5670 BPF_LD_MAP_FD(BPF_REG_1, 0), 5671 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5672 BPF_EXIT_INSN(), 5673 }, 5674 .fixup_map3 = { 3, 8 }, 5675 .result = ACCEPT, 5676 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5677 }, 5678 { 5679 "map update helper access to map", 5680 .insns = { 5681 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5682 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5683 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5684 BPF_LD_MAP_FD(BPF_REG_1, 0), 5685 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5686 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5687 BPF_MOV64_IMM(BPF_REG_4, 0), 5688 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 5689 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5690 BPF_LD_MAP_FD(BPF_REG_1, 0), 5691 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 5692 BPF_EXIT_INSN(), 5693 }, 5694 .fixup_map3 = { 3, 10 }, 5695 .result = ACCEPT, 5696 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5697 }, 5698 { 5699 "map update helper access to map: wrong size", 5700 .insns = { 5701 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5702 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5703 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5704 BPF_LD_MAP_FD(BPF_REG_1, 0), 5705 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5706 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5707 BPF_MOV64_IMM(BPF_REG_4, 0), 5708 BPF_MOV64_REG(BPF_REG_3, BPF_REG_0), 5709 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5710 BPF_LD_MAP_FD(BPF_REG_1, 0), 5711 BPF_EMIT_CALL(BPF_FUNC_map_update_elem), 5712 BPF_EXIT_INSN(), 5713 }, 5714 .fixup_map1 = { 3 }, 5715 .fixup_map3 = { 10 }, 5716 .result = REJECT, 5717 .errstr = "invalid access to map value, value_size=8 off=0 size=16", 5718 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5719 }, 5720 { 5721 "map helper access to adjusted map (via const imm)", 5722 .insns = { 5723 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5724 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5725 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5726 BPF_LD_MAP_FD(BPF_REG_1, 0), 5727 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5728 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5729 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5730 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 5731 offsetof(struct other_val, bar)), 5732 BPF_LD_MAP_FD(BPF_REG_1, 0), 5733 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5734 BPF_EXIT_INSN(), 5735 }, 5736 .fixup_map3 = { 3, 9 }, 5737 .result = ACCEPT, 5738 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5739 }, 5740 { 5741 "map helper access to adjusted map (via const imm): out-of-bound 1", 5742 .insns = { 5743 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5745 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5746 BPF_LD_MAP_FD(BPF_REG_1, 0), 5747 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5748 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5749 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5750 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 5751 sizeof(struct other_val) - 4), 5752 BPF_LD_MAP_FD(BPF_REG_1, 0), 5753 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5754 BPF_EXIT_INSN(), 5755 }, 5756 .fixup_map3 = { 3, 9 }, 5757 .result = REJECT, 5758 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 5759 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5760 }, 5761 { 5762 "map helper access to adjusted map (via const imm): out-of-bound 2", 5763 .insns = { 5764 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5765 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5766 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5767 BPF_LD_MAP_FD(BPF_REG_1, 0), 5768 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5769 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 5770 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5771 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 5772 BPF_LD_MAP_FD(BPF_REG_1, 0), 5773 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5774 BPF_EXIT_INSN(), 5775 }, 5776 .fixup_map3 = { 3, 9 }, 5777 .result = REJECT, 5778 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 5779 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5780 }, 5781 { 5782 "map helper access to adjusted map (via const reg)", 5783 .insns = { 5784 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5785 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5786 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5787 BPF_LD_MAP_FD(BPF_REG_1, 0), 5788 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5789 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5790 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5791 BPF_MOV64_IMM(BPF_REG_3, 5792 offsetof(struct other_val, bar)), 5793 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5794 BPF_LD_MAP_FD(BPF_REG_1, 0), 5795 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5796 BPF_EXIT_INSN(), 5797 }, 5798 .fixup_map3 = { 3, 10 }, 5799 .result = ACCEPT, 5800 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5801 }, 5802 { 5803 "map helper access to adjusted map (via const reg): out-of-bound 1", 5804 .insns = { 5805 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5806 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5807 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5808 BPF_LD_MAP_FD(BPF_REG_1, 0), 5809 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5810 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5811 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5812 BPF_MOV64_IMM(BPF_REG_3, 5813 sizeof(struct other_val) - 4), 5814 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5815 BPF_LD_MAP_FD(BPF_REG_1, 0), 5816 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5817 BPF_EXIT_INSN(), 5818 }, 5819 .fixup_map3 = { 3, 10 }, 5820 .result = REJECT, 5821 .errstr = "invalid access to map value, value_size=16 off=12 size=8", 5822 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5823 }, 5824 { 5825 "map helper access to adjusted map (via const reg): out-of-bound 2", 5826 .insns = { 5827 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5828 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5829 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5830 BPF_LD_MAP_FD(BPF_REG_1, 0), 5831 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5832 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5833 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5834 BPF_MOV64_IMM(BPF_REG_3, -4), 5835 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5836 BPF_LD_MAP_FD(BPF_REG_1, 0), 5837 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5838 BPF_EXIT_INSN(), 5839 }, 5840 .fixup_map3 = { 3, 10 }, 5841 .result = REJECT, 5842 .errstr = "invalid access to map value, value_size=16 off=-4 size=8", 5843 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5844 }, 5845 { 5846 "map helper access to adjusted map (via variable)", 5847 .insns = { 5848 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5849 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5850 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5851 BPF_LD_MAP_FD(BPF_REG_1, 0), 5852 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5853 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5854 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5855 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5856 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5857 offsetof(struct other_val, bar), 4), 5858 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5859 BPF_LD_MAP_FD(BPF_REG_1, 0), 5860 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5861 BPF_EXIT_INSN(), 5862 }, 5863 .fixup_map3 = { 3, 11 }, 5864 .result = ACCEPT, 5865 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5866 }, 5867 { 5868 "map helper access to adjusted map (via variable): no max check", 5869 .insns = { 5870 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5871 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5872 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5873 BPF_LD_MAP_FD(BPF_REG_1, 0), 5874 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5875 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5876 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5877 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5878 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5879 BPF_LD_MAP_FD(BPF_REG_1, 0), 5880 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5881 BPF_EXIT_INSN(), 5882 }, 5883 .fixup_map3 = { 3, 10 }, 5884 .result = REJECT, 5885 .errstr = "R2 unbounded memory access, make sure to bounds check any array access into a map", 5886 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5887 }, 5888 { 5889 "map helper access to adjusted map (via variable): wrong max check", 5890 .insns = { 5891 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5892 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5893 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5894 BPF_LD_MAP_FD(BPF_REG_1, 0), 5895 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5896 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 5897 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 5898 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_0, 0), 5899 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 5900 offsetof(struct other_val, bar) + 1, 4), 5901 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_3), 5902 BPF_LD_MAP_FD(BPF_REG_1, 0), 5903 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5904 BPF_EXIT_INSN(), 5905 }, 5906 .fixup_map3 = { 3, 11 }, 5907 .result = REJECT, 5908 .errstr = "invalid access to map value, value_size=16 off=9 size=8", 5909 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5910 }, 5911 { 5912 "map element value is preserved across register spilling", 5913 .insns = { 5914 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5915 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5916 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5917 BPF_LD_MAP_FD(BPF_REG_1, 0), 5918 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5919 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 5920 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 5921 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5922 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 5923 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 5924 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 5925 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 5926 BPF_EXIT_INSN(), 5927 }, 5928 .fixup_map2 = { 3 }, 5929 .errstr_unpriv = "R0 leaks addr", 5930 .result = ACCEPT, 5931 .result_unpriv = REJECT, 5932 }, 5933 { 5934 "map element value or null is marked on register spilling", 5935 .insns = { 5936 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5937 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5938 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5939 BPF_LD_MAP_FD(BPF_REG_1, 0), 5940 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5941 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 5942 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -152), 5943 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 5944 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 5945 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 5946 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 5947 BPF_EXIT_INSN(), 5948 }, 5949 .fixup_map2 = { 3 }, 5950 .errstr_unpriv = "R0 leaks addr", 5951 .result = ACCEPT, 5952 .result_unpriv = REJECT, 5953 }, 5954 { 5955 "map element value store of cleared call register", 5956 .insns = { 5957 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5958 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5959 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5960 BPF_LD_MAP_FD(BPF_REG_1, 0), 5961 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5962 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 5963 BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 5964 BPF_EXIT_INSN(), 5965 }, 5966 .fixup_map2 = { 3 }, 5967 .errstr_unpriv = "R1 !read_ok", 5968 .errstr = "R1 !read_ok", 5969 .result = REJECT, 5970 .result_unpriv = REJECT, 5971 }, 5972 { 5973 "map element value with unaligned store", 5974 .insns = { 5975 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5976 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5977 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 5978 BPF_LD_MAP_FD(BPF_REG_1, 0), 5979 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 5980 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 17), 5981 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 5982 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 5983 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 43), 5984 BPF_ST_MEM(BPF_DW, BPF_REG_0, -2, 44), 5985 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 5986 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 32), 5987 BPF_ST_MEM(BPF_DW, BPF_REG_8, 2, 33), 5988 BPF_ST_MEM(BPF_DW, BPF_REG_8, -2, 34), 5989 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 5), 5990 BPF_ST_MEM(BPF_DW, BPF_REG_8, 0, 22), 5991 BPF_ST_MEM(BPF_DW, BPF_REG_8, 4, 23), 5992 BPF_ST_MEM(BPF_DW, BPF_REG_8, -7, 24), 5993 BPF_MOV64_REG(BPF_REG_7, BPF_REG_8), 5994 BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 3), 5995 BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 22), 5996 BPF_ST_MEM(BPF_DW, BPF_REG_7, 4, 23), 5997 BPF_ST_MEM(BPF_DW, BPF_REG_7, -4, 24), 5998 BPF_EXIT_INSN(), 5999 }, 6000 .fixup_map2 = { 3 }, 6001 .errstr_unpriv = "R0 leaks addr", 6002 .result = ACCEPT, 6003 .result_unpriv = REJECT, 6004 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 6005 }, 6006 { 6007 "map element value with unaligned load", 6008 .insns = { 6009 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6010 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6011 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6012 BPF_LD_MAP_FD(BPF_REG_1, 0), 6013 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6014 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 6015 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 6016 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, MAX_ENTRIES, 9), 6017 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 6018 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 6019 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 2), 6020 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 6021 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 0), 6022 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_8, 2), 6023 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 5), 6024 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 6025 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 4), 6026 BPF_EXIT_INSN(), 6027 }, 6028 .fixup_map2 = { 3 }, 6029 .errstr_unpriv = "R0 leaks addr", 6030 .result = ACCEPT, 6031 .result_unpriv = REJECT, 6032 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 6033 }, 6034 { 6035 "map element value illegal alu op, 1", 6036 .insns = { 6037 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6038 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6039 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6040 BPF_LD_MAP_FD(BPF_REG_1, 0), 6041 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6042 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6043 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 8), 6044 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 6045 BPF_EXIT_INSN(), 6046 }, 6047 .fixup_map2 = { 3 }, 6048 .errstr = "R0 bitwise operator &= on pointer", 6049 .result = REJECT, 6050 }, 6051 { 6052 "map element value illegal alu op, 2", 6053 .insns = { 6054 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6055 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6056 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6057 BPF_LD_MAP_FD(BPF_REG_1, 0), 6058 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6059 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6060 BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0), 6061 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 6062 BPF_EXIT_INSN(), 6063 }, 6064 .fixup_map2 = { 3 }, 6065 .errstr = "R0 32-bit pointer arithmetic prohibited", 6066 .result = REJECT, 6067 }, 6068 { 6069 "map element value illegal alu op, 3", 6070 .insns = { 6071 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6072 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6073 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6074 BPF_LD_MAP_FD(BPF_REG_1, 0), 6075 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6076 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6077 BPF_ALU64_IMM(BPF_DIV, BPF_REG_0, 42), 6078 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 6079 BPF_EXIT_INSN(), 6080 }, 6081 .fixup_map2 = { 3 }, 6082 .errstr = "R0 pointer arithmetic with /= operator", 6083 .result = REJECT, 6084 }, 6085 { 6086 "map element value illegal alu op, 4", 6087 .insns = { 6088 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6089 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6090 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6091 BPF_LD_MAP_FD(BPF_REG_1, 0), 6092 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6093 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 6094 BPF_ENDIAN(BPF_FROM_BE, BPF_REG_0, 64), 6095 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 6096 BPF_EXIT_INSN(), 6097 }, 6098 .fixup_map2 = { 3 }, 6099 .errstr_unpriv = "R0 pointer arithmetic prohibited", 6100 .errstr = "invalid mem access 'inv'", 6101 .result = REJECT, 6102 .result_unpriv = REJECT, 6103 }, 6104 { 6105 "map element value illegal alu op, 5", 6106 .insns = { 6107 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6108 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6109 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6110 BPF_LD_MAP_FD(BPF_REG_1, 0), 6111 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6112 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6113 BPF_MOV64_IMM(BPF_REG_3, 4096), 6114 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6115 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6116 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 6117 BPF_STX_XADD(BPF_DW, BPF_REG_2, BPF_REG_3, 0), 6118 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_2, 0), 6119 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 22), 6120 BPF_EXIT_INSN(), 6121 }, 6122 .fixup_map2 = { 3 }, 6123 .errstr = "R0 invalid mem access 'inv'", 6124 .result = REJECT, 6125 }, 6126 { 6127 "map element value is preserved across register spilling", 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, 7), 6135 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 6136 offsetof(struct test_val, foo)), 6137 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 6138 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6139 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -184), 6140 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 6141 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_1, 0), 6142 BPF_ST_MEM(BPF_DW, BPF_REG_3, 0, 42), 6143 BPF_EXIT_INSN(), 6144 }, 6145 .fixup_map2 = { 3 }, 6146 .errstr_unpriv = "R0 leaks addr", 6147 .result = ACCEPT, 6148 .result_unpriv = REJECT, 6149 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 6150 }, 6151 { 6152 "helper access to variable memory: stack, bitwise AND + JMP, correct bounds", 6153 .insns = { 6154 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6155 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6156 BPF_MOV64_IMM(BPF_REG_0, 0), 6157 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 6158 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 6159 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 6160 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 6161 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 6162 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 6163 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 6164 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 6165 BPF_MOV64_IMM(BPF_REG_2, 16), 6166 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6167 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6168 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 6169 BPF_MOV64_IMM(BPF_REG_4, 0), 6170 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 6171 BPF_MOV64_IMM(BPF_REG_3, 0), 6172 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6173 BPF_MOV64_IMM(BPF_REG_0, 0), 6174 BPF_EXIT_INSN(), 6175 }, 6176 .result = ACCEPT, 6177 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6178 }, 6179 { 6180 "helper access to variable memory: stack, bitwise AND, zero included", 6181 .insns = { 6182 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6183 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6184 BPF_MOV64_IMM(BPF_REG_2, 16), 6185 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6186 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6187 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 6188 BPF_MOV64_IMM(BPF_REG_3, 0), 6189 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6190 BPF_EXIT_INSN(), 6191 }, 6192 .errstr = "invalid indirect read from stack off -64+0 size 64", 6193 .result = REJECT, 6194 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6195 }, 6196 { 6197 "helper access to variable memory: stack, bitwise AND + JMP, wrong max", 6198 .insns = { 6199 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6200 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6201 BPF_MOV64_IMM(BPF_REG_2, 16), 6202 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6203 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6204 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 65), 6205 BPF_MOV64_IMM(BPF_REG_4, 0), 6206 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 6207 BPF_MOV64_IMM(BPF_REG_3, 0), 6208 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6209 BPF_MOV64_IMM(BPF_REG_0, 0), 6210 BPF_EXIT_INSN(), 6211 }, 6212 .errstr = "invalid stack type R1 off=-64 access_size=65", 6213 .result = REJECT, 6214 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6215 }, 6216 { 6217 "helper access to variable memory: stack, JMP, correct bounds", 6218 .insns = { 6219 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6220 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6221 BPF_MOV64_IMM(BPF_REG_0, 0), 6222 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 6223 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 6224 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 6225 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 6226 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 6227 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 6228 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 6229 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 6230 BPF_MOV64_IMM(BPF_REG_2, 16), 6231 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6232 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6233 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 4), 6234 BPF_MOV64_IMM(BPF_REG_4, 0), 6235 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 6236 BPF_MOV64_IMM(BPF_REG_3, 0), 6237 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6238 BPF_MOV64_IMM(BPF_REG_0, 0), 6239 BPF_EXIT_INSN(), 6240 }, 6241 .result = ACCEPT, 6242 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6243 }, 6244 { 6245 "helper access to variable memory: stack, JMP (signed), correct bounds", 6246 .insns = { 6247 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6248 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6249 BPF_MOV64_IMM(BPF_REG_0, 0), 6250 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 6251 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 6252 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 6253 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 6254 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 6255 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 6256 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 6257 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 6258 BPF_MOV64_IMM(BPF_REG_2, 16), 6259 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6260 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6261 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 4), 6262 BPF_MOV64_IMM(BPF_REG_4, 0), 6263 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 6264 BPF_MOV64_IMM(BPF_REG_3, 0), 6265 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6266 BPF_MOV64_IMM(BPF_REG_0, 0), 6267 BPF_EXIT_INSN(), 6268 }, 6269 .result = ACCEPT, 6270 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6271 }, 6272 { 6273 "helper access to variable memory: stack, JMP, bounds + offset", 6274 .insns = { 6275 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6276 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6277 BPF_MOV64_IMM(BPF_REG_2, 16), 6278 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6279 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6280 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 5), 6281 BPF_MOV64_IMM(BPF_REG_4, 0), 6282 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 3), 6283 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 6284 BPF_MOV64_IMM(BPF_REG_3, 0), 6285 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6286 BPF_MOV64_IMM(BPF_REG_0, 0), 6287 BPF_EXIT_INSN(), 6288 }, 6289 .errstr = "invalid stack type R1 off=-64 access_size=65", 6290 .result = REJECT, 6291 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6292 }, 6293 { 6294 "helper access to variable memory: stack, JMP, wrong max", 6295 .insns = { 6296 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6297 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6298 BPF_MOV64_IMM(BPF_REG_2, 16), 6299 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6300 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6301 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 65, 4), 6302 BPF_MOV64_IMM(BPF_REG_4, 0), 6303 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 6304 BPF_MOV64_IMM(BPF_REG_3, 0), 6305 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6306 BPF_MOV64_IMM(BPF_REG_0, 0), 6307 BPF_EXIT_INSN(), 6308 }, 6309 .errstr = "invalid stack type R1 off=-64 access_size=65", 6310 .result = REJECT, 6311 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6312 }, 6313 { 6314 "helper access to variable memory: stack, JMP, no max check", 6315 .insns = { 6316 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6317 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6318 BPF_MOV64_IMM(BPF_REG_2, 16), 6319 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6320 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6321 BPF_MOV64_IMM(BPF_REG_4, 0), 6322 BPF_JMP_REG(BPF_JGE, BPF_REG_4, BPF_REG_2, 2), 6323 BPF_MOV64_IMM(BPF_REG_3, 0), 6324 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6325 BPF_MOV64_IMM(BPF_REG_0, 0), 6326 BPF_EXIT_INSN(), 6327 }, 6328 /* because max wasn't checked, signed min is negative */ 6329 .errstr = "R2 min value is negative, either use unsigned or 'var &= const'", 6330 .result = REJECT, 6331 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6332 }, 6333 { 6334 "helper access to variable memory: stack, JMP, no min check", 6335 .insns = { 6336 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6337 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6338 BPF_MOV64_IMM(BPF_REG_2, 16), 6339 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6340 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6341 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 64, 3), 6342 BPF_MOV64_IMM(BPF_REG_3, 0), 6343 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6344 BPF_MOV64_IMM(BPF_REG_0, 0), 6345 BPF_EXIT_INSN(), 6346 }, 6347 .errstr = "invalid indirect read from stack off -64+0 size 64", 6348 .result = REJECT, 6349 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6350 }, 6351 { 6352 "helper access to variable memory: stack, JMP (signed), no min check", 6353 .insns = { 6354 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6356 BPF_MOV64_IMM(BPF_REG_2, 16), 6357 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, -128), 6358 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_1, -128), 6359 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 64, 3), 6360 BPF_MOV64_IMM(BPF_REG_3, 0), 6361 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6362 BPF_MOV64_IMM(BPF_REG_0, 0), 6363 BPF_EXIT_INSN(), 6364 }, 6365 .errstr = "R2 min value is negative", 6366 .result = REJECT, 6367 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6368 }, 6369 { 6370 "helper access to variable memory: map, JMP, correct bounds", 6371 .insns = { 6372 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6373 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6374 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6375 BPF_LD_MAP_FD(BPF_REG_1, 0), 6376 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6377 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 6378 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6379 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6380 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6381 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6382 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 6383 sizeof(struct test_val), 4), 6384 BPF_MOV64_IMM(BPF_REG_4, 0), 6385 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 6386 BPF_MOV64_IMM(BPF_REG_3, 0), 6387 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6388 BPF_MOV64_IMM(BPF_REG_0, 0), 6389 BPF_EXIT_INSN(), 6390 }, 6391 .fixup_map2 = { 3 }, 6392 .result = ACCEPT, 6393 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6394 }, 6395 { 6396 "helper access to variable memory: map, JMP, wrong max", 6397 .insns = { 6398 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6399 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6400 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6401 BPF_LD_MAP_FD(BPF_REG_1, 0), 6402 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6403 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 6404 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6405 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6406 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6407 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6408 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 6409 sizeof(struct test_val) + 1, 4), 6410 BPF_MOV64_IMM(BPF_REG_4, 0), 6411 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 6412 BPF_MOV64_IMM(BPF_REG_3, 0), 6413 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6414 BPF_MOV64_IMM(BPF_REG_0, 0), 6415 BPF_EXIT_INSN(), 6416 }, 6417 .fixup_map2 = { 3 }, 6418 .errstr = "invalid access to map value, value_size=48 off=0 size=49", 6419 .result = REJECT, 6420 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6421 }, 6422 { 6423 "helper access to variable memory: map adjusted, JMP, correct bounds", 6424 .insns = { 6425 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6426 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6427 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6428 BPF_LD_MAP_FD(BPF_REG_1, 0), 6429 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6430 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 6431 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6432 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 6433 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6434 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6435 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6436 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 6437 sizeof(struct test_val) - 20, 4), 6438 BPF_MOV64_IMM(BPF_REG_4, 0), 6439 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 6440 BPF_MOV64_IMM(BPF_REG_3, 0), 6441 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6442 BPF_MOV64_IMM(BPF_REG_0, 0), 6443 BPF_EXIT_INSN(), 6444 }, 6445 .fixup_map2 = { 3 }, 6446 .result = ACCEPT, 6447 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6448 }, 6449 { 6450 "helper access to variable memory: map adjusted, JMP, wrong max", 6451 .insns = { 6452 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6453 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6454 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6455 BPF_LD_MAP_FD(BPF_REG_1, 0), 6456 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6457 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 6458 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6459 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 20), 6460 BPF_MOV64_IMM(BPF_REG_2, sizeof(struct test_val)), 6461 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6462 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6463 BPF_JMP_IMM(BPF_JSGT, BPF_REG_2, 6464 sizeof(struct test_val) - 19, 4), 6465 BPF_MOV64_IMM(BPF_REG_4, 0), 6466 BPF_JMP_REG(BPF_JSGE, BPF_REG_4, BPF_REG_2, 2), 6467 BPF_MOV64_IMM(BPF_REG_3, 0), 6468 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6469 BPF_MOV64_IMM(BPF_REG_0, 0), 6470 BPF_EXIT_INSN(), 6471 }, 6472 .fixup_map2 = { 3 }, 6473 .errstr = "R1 min value is outside of the array range", 6474 .result = REJECT, 6475 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6476 }, 6477 { 6478 "helper access to variable memory: size = 0 allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 6479 .insns = { 6480 BPF_MOV64_IMM(BPF_REG_1, 0), 6481 BPF_MOV64_IMM(BPF_REG_2, 0), 6482 BPF_MOV64_IMM(BPF_REG_3, 0), 6483 BPF_MOV64_IMM(BPF_REG_4, 0), 6484 BPF_MOV64_IMM(BPF_REG_5, 0), 6485 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6486 BPF_EXIT_INSN(), 6487 }, 6488 .result = ACCEPT, 6489 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6490 }, 6491 { 6492 "helper access to variable memory: size > 0 not allowed on NULL (ARG_PTR_TO_MEM_OR_NULL)", 6493 .insns = { 6494 BPF_MOV64_IMM(BPF_REG_1, 0), 6495 BPF_MOV64_IMM(BPF_REG_2, 1), 6496 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6497 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6498 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 64), 6499 BPF_MOV64_IMM(BPF_REG_3, 0), 6500 BPF_MOV64_IMM(BPF_REG_4, 0), 6501 BPF_MOV64_IMM(BPF_REG_5, 0), 6502 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6503 BPF_EXIT_INSN(), 6504 }, 6505 .errstr = "R1 type=inv expected=fp", 6506 .result = REJECT, 6507 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6508 }, 6509 { 6510 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 6511 .insns = { 6512 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6513 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 6514 BPF_MOV64_IMM(BPF_REG_2, 0), 6515 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 6516 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 8), 6517 BPF_MOV64_IMM(BPF_REG_3, 0), 6518 BPF_MOV64_IMM(BPF_REG_4, 0), 6519 BPF_MOV64_IMM(BPF_REG_5, 0), 6520 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6521 BPF_EXIT_INSN(), 6522 }, 6523 .result = ACCEPT, 6524 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6525 }, 6526 { 6527 "helper access to variable memory: size = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 6528 .insns = { 6529 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6530 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6531 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6532 BPF_LD_MAP_FD(BPF_REG_1, 0), 6533 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6534 BPF_FUNC_map_lookup_elem), 6535 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6536 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6537 BPF_MOV64_IMM(BPF_REG_2, 0), 6538 BPF_MOV64_IMM(BPF_REG_3, 0), 6539 BPF_MOV64_IMM(BPF_REG_4, 0), 6540 BPF_MOV64_IMM(BPF_REG_5, 0), 6541 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6542 BPF_EXIT_INSN(), 6543 }, 6544 .fixup_map1 = { 3 }, 6545 .result = ACCEPT, 6546 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6547 }, 6548 { 6549 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (ARG_PTR_TO_MEM_OR_NULL)", 6550 .insns = { 6551 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6552 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6553 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6554 BPF_LD_MAP_FD(BPF_REG_1, 0), 6555 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6556 BPF_FUNC_map_lookup_elem), 6557 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 6558 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 6559 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 7), 6560 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6561 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 6562 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 6563 BPF_MOV64_IMM(BPF_REG_3, 0), 6564 BPF_MOV64_IMM(BPF_REG_4, 0), 6565 BPF_MOV64_IMM(BPF_REG_5, 0), 6566 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6567 BPF_EXIT_INSN(), 6568 }, 6569 .fixup_map1 = { 3 }, 6570 .result = ACCEPT, 6571 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6572 }, 6573 { 6574 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (ARG_PTR_TO_MEM_OR_NULL)", 6575 .insns = { 6576 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6577 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6578 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6579 BPF_LD_MAP_FD(BPF_REG_1, 0), 6580 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6581 BPF_FUNC_map_lookup_elem), 6582 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 6583 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6584 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 6585 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 6586 BPF_MOV64_IMM(BPF_REG_3, 0), 6587 BPF_MOV64_IMM(BPF_REG_4, 0), 6588 BPF_MOV64_IMM(BPF_REG_5, 0), 6589 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6590 BPF_EXIT_INSN(), 6591 }, 6592 .fixup_map1 = { 3 }, 6593 .result = ACCEPT, 6594 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6595 }, 6596 { 6597 "helper access to variable memory: size possible = 0 allowed on != NULL packet pointer (ARG_PTR_TO_MEM_OR_NULL)", 6598 .insns = { 6599 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 6600 offsetof(struct __sk_buff, data)), 6601 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 6602 offsetof(struct __sk_buff, data_end)), 6603 BPF_MOV64_REG(BPF_REG_0, BPF_REG_6), 6604 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 6605 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 7), 6606 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 6607 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_6, 0), 6608 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 6609 BPF_MOV64_IMM(BPF_REG_3, 0), 6610 BPF_MOV64_IMM(BPF_REG_4, 0), 6611 BPF_MOV64_IMM(BPF_REG_5, 0), 6612 BPF_EMIT_CALL(BPF_FUNC_csum_diff), 6613 BPF_EXIT_INSN(), 6614 }, 6615 .result = ACCEPT, 6616 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6617 .retval = 0 /* csum_diff of 64-byte packet */, 6618 }, 6619 { 6620 "helper access to variable memory: size = 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 6621 .insns = { 6622 BPF_MOV64_IMM(BPF_REG_1, 0), 6623 BPF_MOV64_IMM(BPF_REG_2, 0), 6624 BPF_MOV64_IMM(BPF_REG_3, 0), 6625 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6626 BPF_EXIT_INSN(), 6627 }, 6628 .errstr = "R1 type=inv expected=fp", 6629 .result = REJECT, 6630 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6631 }, 6632 { 6633 "helper access to variable memory: size > 0 not allowed on NULL (!ARG_PTR_TO_MEM_OR_NULL)", 6634 .insns = { 6635 BPF_MOV64_IMM(BPF_REG_1, 0), 6636 BPF_MOV64_IMM(BPF_REG_2, 1), 6637 BPF_MOV64_IMM(BPF_REG_3, 0), 6638 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6639 BPF_EXIT_INSN(), 6640 }, 6641 .errstr = "R1 type=inv expected=fp", 6642 .result = REJECT, 6643 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6644 }, 6645 { 6646 "helper access to variable memory: size = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 6647 .insns = { 6648 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6649 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 6650 BPF_MOV64_IMM(BPF_REG_2, 0), 6651 BPF_MOV64_IMM(BPF_REG_3, 0), 6652 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6653 BPF_EXIT_INSN(), 6654 }, 6655 .result = ACCEPT, 6656 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6657 }, 6658 { 6659 "helper access to variable memory: size = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 6660 .insns = { 6661 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6662 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6663 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6664 BPF_LD_MAP_FD(BPF_REG_1, 0), 6665 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6666 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6667 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6668 BPF_MOV64_IMM(BPF_REG_2, 0), 6669 BPF_MOV64_IMM(BPF_REG_3, 0), 6670 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6671 BPF_EXIT_INSN(), 6672 }, 6673 .fixup_map1 = { 3 }, 6674 .result = ACCEPT, 6675 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6676 }, 6677 { 6678 "helper access to variable memory: size possible = 0 allowed on != NULL stack pointer (!ARG_PTR_TO_MEM_OR_NULL)", 6679 .insns = { 6680 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6681 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6682 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6683 BPF_LD_MAP_FD(BPF_REG_1, 0), 6684 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6685 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6686 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 6687 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 4), 6688 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6689 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 6690 BPF_MOV64_IMM(BPF_REG_3, 0), 6691 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6692 BPF_EXIT_INSN(), 6693 }, 6694 .fixup_map1 = { 3 }, 6695 .result = ACCEPT, 6696 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6697 }, 6698 { 6699 "helper access to variable memory: size possible = 0 allowed on != NULL map pointer (!ARG_PTR_TO_MEM_OR_NULL)", 6700 .insns = { 6701 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6702 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6703 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6704 BPF_LD_MAP_FD(BPF_REG_1, 0), 6705 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6706 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6708 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 6709 BPF_JMP_IMM(BPF_JGT, BPF_REG_2, 8, 2), 6710 BPF_MOV64_IMM(BPF_REG_3, 0), 6711 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6712 BPF_EXIT_INSN(), 6713 }, 6714 .fixup_map1 = { 3 }, 6715 .result = ACCEPT, 6716 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6717 }, 6718 { 6719 "helper access to variable memory: 8 bytes leak", 6720 .insns = { 6721 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6723 BPF_MOV64_IMM(BPF_REG_0, 0), 6724 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 6725 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 6726 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 6727 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 6728 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 6729 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 6730 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 6731 BPF_MOV64_IMM(BPF_REG_2, 1), 6732 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_2, -128), 6733 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_10, -128), 6734 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 63), 6735 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 1), 6736 BPF_MOV64_IMM(BPF_REG_3, 0), 6737 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6738 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 6739 BPF_EXIT_INSN(), 6740 }, 6741 .errstr = "invalid indirect read from stack off -64+32 size 64", 6742 .result = REJECT, 6743 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6744 }, 6745 { 6746 "helper access to variable memory: 8 bytes no leak (init memory)", 6747 .insns = { 6748 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6749 BPF_MOV64_IMM(BPF_REG_0, 0), 6750 BPF_MOV64_IMM(BPF_REG_0, 0), 6751 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -64), 6752 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -56), 6753 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -48), 6754 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -40), 6755 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -32), 6756 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -24), 6757 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -16), 6758 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 6759 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -64), 6760 BPF_MOV64_IMM(BPF_REG_2, 0), 6761 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 32), 6762 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 32), 6763 BPF_MOV64_IMM(BPF_REG_3, 0), 6764 BPF_EMIT_CALL(BPF_FUNC_probe_read), 6765 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 6766 BPF_EXIT_INSN(), 6767 }, 6768 .result = ACCEPT, 6769 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6770 }, 6771 { 6772 "invalid and of negative number", 6773 .insns = { 6774 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6775 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6776 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6777 BPF_LD_MAP_FD(BPF_REG_1, 0), 6778 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6779 BPF_FUNC_map_lookup_elem), 6780 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 6781 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 6782 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, -4), 6783 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 2), 6784 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 6785 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 6786 offsetof(struct test_val, foo)), 6787 BPF_EXIT_INSN(), 6788 }, 6789 .fixup_map2 = { 3 }, 6790 .errstr = "R0 max value is outside of the array range", 6791 .result = REJECT, 6792 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 6793 }, 6794 { 6795 "invalid range check", 6796 .insns = { 6797 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6798 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6799 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 6800 BPF_LD_MAP_FD(BPF_REG_1, 0), 6801 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6802 BPF_FUNC_map_lookup_elem), 6803 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 12), 6804 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), 6805 BPF_MOV64_IMM(BPF_REG_9, 1), 6806 BPF_ALU32_IMM(BPF_MOD, BPF_REG_1, 2), 6807 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 1), 6808 BPF_ALU32_REG(BPF_AND, BPF_REG_9, BPF_REG_1), 6809 BPF_ALU32_IMM(BPF_ADD, BPF_REG_9, 1), 6810 BPF_ALU32_IMM(BPF_RSH, BPF_REG_9, 1), 6811 BPF_MOV32_IMM(BPF_REG_3, 1), 6812 BPF_ALU32_REG(BPF_SUB, BPF_REG_3, BPF_REG_9), 6813 BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0x10000000), 6814 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), 6815 BPF_STX_MEM(BPF_W, BPF_REG_0, BPF_REG_3, 0), 6816 BPF_MOV64_REG(BPF_REG_0, 0), 6817 BPF_EXIT_INSN(), 6818 }, 6819 .fixup_map2 = { 3 }, 6820 .errstr = "R0 max value is outside of the array range", 6821 .result = REJECT, 6822 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 6823 }, 6824 { 6825 "map in map access", 6826 .insns = { 6827 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6828 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6829 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6830 BPF_LD_MAP_FD(BPF_REG_1, 0), 6831 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6832 BPF_FUNC_map_lookup_elem), 6833 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 6834 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6835 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6836 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6837 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6838 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6839 BPF_FUNC_map_lookup_elem), 6840 BPF_MOV64_REG(BPF_REG_0, 0), 6841 BPF_EXIT_INSN(), 6842 }, 6843 .fixup_map_in_map = { 3 }, 6844 .result = ACCEPT, 6845 }, 6846 { 6847 "invalid inner map pointer", 6848 .insns = { 6849 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6850 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6851 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6852 BPF_LD_MAP_FD(BPF_REG_1, 0), 6853 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6854 BPF_FUNC_map_lookup_elem), 6855 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 6856 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6857 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6858 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6859 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6860 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 6861 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6862 BPF_FUNC_map_lookup_elem), 6863 BPF_MOV64_REG(BPF_REG_0, 0), 6864 BPF_EXIT_INSN(), 6865 }, 6866 .fixup_map_in_map = { 3 }, 6867 .errstr = "R1 pointer arithmetic on CONST_PTR_TO_MAP prohibited", 6868 .result = REJECT, 6869 }, 6870 { 6871 "forgot null checking on the inner map pointer", 6872 .insns = { 6873 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6874 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6875 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6876 BPF_LD_MAP_FD(BPF_REG_1, 0), 6877 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6878 BPF_FUNC_map_lookup_elem), 6879 BPF_ST_MEM(0, BPF_REG_10, -4, 0), 6880 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 6881 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), 6882 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 6883 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6884 BPF_FUNC_map_lookup_elem), 6885 BPF_MOV64_REG(BPF_REG_0, 0), 6886 BPF_EXIT_INSN(), 6887 }, 6888 .fixup_map_in_map = { 3 }, 6889 .errstr = "R1 type=map_value_or_null expected=map_ptr", 6890 .result = REJECT, 6891 }, 6892 { 6893 "ld_abs: check calling conv, r1", 6894 .insns = { 6895 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6896 BPF_MOV64_IMM(BPF_REG_1, 0), 6897 BPF_LD_ABS(BPF_W, -0x200000), 6898 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 6899 BPF_EXIT_INSN(), 6900 }, 6901 .errstr = "R1 !read_ok", 6902 .result = REJECT, 6903 }, 6904 { 6905 "ld_abs: check calling conv, r2", 6906 .insns = { 6907 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6908 BPF_MOV64_IMM(BPF_REG_2, 0), 6909 BPF_LD_ABS(BPF_W, -0x200000), 6910 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 6911 BPF_EXIT_INSN(), 6912 }, 6913 .errstr = "R2 !read_ok", 6914 .result = REJECT, 6915 }, 6916 { 6917 "ld_abs: check calling conv, r3", 6918 .insns = { 6919 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6920 BPF_MOV64_IMM(BPF_REG_3, 0), 6921 BPF_LD_ABS(BPF_W, -0x200000), 6922 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 6923 BPF_EXIT_INSN(), 6924 }, 6925 .errstr = "R3 !read_ok", 6926 .result = REJECT, 6927 }, 6928 { 6929 "ld_abs: check calling conv, r4", 6930 .insns = { 6931 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6932 BPF_MOV64_IMM(BPF_REG_4, 0), 6933 BPF_LD_ABS(BPF_W, -0x200000), 6934 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 6935 BPF_EXIT_INSN(), 6936 }, 6937 .errstr = "R4 !read_ok", 6938 .result = REJECT, 6939 }, 6940 { 6941 "ld_abs: check calling conv, r5", 6942 .insns = { 6943 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6944 BPF_MOV64_IMM(BPF_REG_5, 0), 6945 BPF_LD_ABS(BPF_W, -0x200000), 6946 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 6947 BPF_EXIT_INSN(), 6948 }, 6949 .errstr = "R5 !read_ok", 6950 .result = REJECT, 6951 }, 6952 { 6953 "ld_abs: check calling conv, r7", 6954 .insns = { 6955 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6956 BPF_MOV64_IMM(BPF_REG_7, 0), 6957 BPF_LD_ABS(BPF_W, -0x200000), 6958 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 6959 BPF_EXIT_INSN(), 6960 }, 6961 .result = ACCEPT, 6962 }, 6963 { 6964 "ld_abs: tests on r6 and skb data reload helper", 6965 .insns = { 6966 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6967 BPF_LD_ABS(BPF_B, 0), 6968 BPF_LD_ABS(BPF_H, 0), 6969 BPF_LD_ABS(BPF_W, 0), 6970 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 6971 BPF_MOV64_IMM(BPF_REG_6, 0), 6972 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 6973 BPF_MOV64_IMM(BPF_REG_2, 1), 6974 BPF_MOV64_IMM(BPF_REG_3, 2), 6975 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 6976 BPF_FUNC_skb_vlan_push), 6977 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 6978 BPF_LD_ABS(BPF_B, 0), 6979 BPF_LD_ABS(BPF_H, 0), 6980 BPF_LD_ABS(BPF_W, 0), 6981 BPF_MOV64_IMM(BPF_REG_0, 42), 6982 BPF_EXIT_INSN(), 6983 }, 6984 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6985 .result = ACCEPT, 6986 .retval = 42 /* ultimate return value */, 6987 }, 6988 { 6989 "ld_ind: check calling conv, r1", 6990 .insns = { 6991 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6992 BPF_MOV64_IMM(BPF_REG_1, 1), 6993 BPF_LD_IND(BPF_W, BPF_REG_1, -0x200000), 6994 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 6995 BPF_EXIT_INSN(), 6996 }, 6997 .errstr = "R1 !read_ok", 6998 .result = REJECT, 6999 }, 7000 { 7001 "ld_ind: check calling conv, r2", 7002 .insns = { 7003 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7004 BPF_MOV64_IMM(BPF_REG_2, 1), 7005 BPF_LD_IND(BPF_W, BPF_REG_2, -0x200000), 7006 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 7007 BPF_EXIT_INSN(), 7008 }, 7009 .errstr = "R2 !read_ok", 7010 .result = REJECT, 7011 }, 7012 { 7013 "ld_ind: check calling conv, r3", 7014 .insns = { 7015 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7016 BPF_MOV64_IMM(BPF_REG_3, 1), 7017 BPF_LD_IND(BPF_W, BPF_REG_3, -0x200000), 7018 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 7019 BPF_EXIT_INSN(), 7020 }, 7021 .errstr = "R3 !read_ok", 7022 .result = REJECT, 7023 }, 7024 { 7025 "ld_ind: check calling conv, r4", 7026 .insns = { 7027 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7028 BPF_MOV64_IMM(BPF_REG_4, 1), 7029 BPF_LD_IND(BPF_W, BPF_REG_4, -0x200000), 7030 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 7031 BPF_EXIT_INSN(), 7032 }, 7033 .errstr = "R4 !read_ok", 7034 .result = REJECT, 7035 }, 7036 { 7037 "ld_ind: check calling conv, r5", 7038 .insns = { 7039 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7040 BPF_MOV64_IMM(BPF_REG_5, 1), 7041 BPF_LD_IND(BPF_W, BPF_REG_5, -0x200000), 7042 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 7043 BPF_EXIT_INSN(), 7044 }, 7045 .errstr = "R5 !read_ok", 7046 .result = REJECT, 7047 }, 7048 { 7049 "ld_ind: check calling conv, r7", 7050 .insns = { 7051 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7052 BPF_MOV64_IMM(BPF_REG_7, 1), 7053 BPF_LD_IND(BPF_W, BPF_REG_7, -0x200000), 7054 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 7055 BPF_EXIT_INSN(), 7056 }, 7057 .result = ACCEPT, 7058 .retval = 1, 7059 }, 7060 { 7061 "check bpf_perf_event_data->sample_period byte load permitted", 7062 .insns = { 7063 BPF_MOV64_IMM(BPF_REG_0, 0), 7064 #if __BYTE_ORDER == __LITTLE_ENDIAN 7065 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 7066 offsetof(struct bpf_perf_event_data, sample_period)), 7067 #else 7068 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 7069 offsetof(struct bpf_perf_event_data, sample_period) + 7), 7070 #endif 7071 BPF_EXIT_INSN(), 7072 }, 7073 .result = ACCEPT, 7074 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 7075 }, 7076 { 7077 "check bpf_perf_event_data->sample_period half load permitted", 7078 .insns = { 7079 BPF_MOV64_IMM(BPF_REG_0, 0), 7080 #if __BYTE_ORDER == __LITTLE_ENDIAN 7081 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7082 offsetof(struct bpf_perf_event_data, sample_period)), 7083 #else 7084 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7085 offsetof(struct bpf_perf_event_data, sample_period) + 6), 7086 #endif 7087 BPF_EXIT_INSN(), 7088 }, 7089 .result = ACCEPT, 7090 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 7091 }, 7092 { 7093 "check bpf_perf_event_data->sample_period word load permitted", 7094 .insns = { 7095 BPF_MOV64_IMM(BPF_REG_0, 0), 7096 #if __BYTE_ORDER == __LITTLE_ENDIAN 7097 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 7098 offsetof(struct bpf_perf_event_data, sample_period)), 7099 #else 7100 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 7101 offsetof(struct bpf_perf_event_data, sample_period) + 4), 7102 #endif 7103 BPF_EXIT_INSN(), 7104 }, 7105 .result = ACCEPT, 7106 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 7107 }, 7108 { 7109 "check bpf_perf_event_data->sample_period dword load permitted", 7110 .insns = { 7111 BPF_MOV64_IMM(BPF_REG_0, 0), 7112 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 7113 offsetof(struct bpf_perf_event_data, sample_period)), 7114 BPF_EXIT_INSN(), 7115 }, 7116 .result = ACCEPT, 7117 .prog_type = BPF_PROG_TYPE_PERF_EVENT, 7118 }, 7119 { 7120 "check skb->data half load not permitted", 7121 .insns = { 7122 BPF_MOV64_IMM(BPF_REG_0, 0), 7123 #if __BYTE_ORDER == __LITTLE_ENDIAN 7124 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7125 offsetof(struct __sk_buff, data)), 7126 #else 7127 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7128 offsetof(struct __sk_buff, data) + 2), 7129 #endif 7130 BPF_EXIT_INSN(), 7131 }, 7132 .result = REJECT, 7133 .errstr = "invalid bpf_context access", 7134 }, 7135 { 7136 "check skb->tc_classid half load not permitted for lwt prog", 7137 .insns = { 7138 BPF_MOV64_IMM(BPF_REG_0, 0), 7139 #if __BYTE_ORDER == __LITTLE_ENDIAN 7140 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7141 offsetof(struct __sk_buff, tc_classid)), 7142 #else 7143 BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 7144 offsetof(struct __sk_buff, tc_classid) + 2), 7145 #endif 7146 BPF_EXIT_INSN(), 7147 }, 7148 .result = REJECT, 7149 .errstr = "invalid bpf_context access", 7150 .prog_type = BPF_PROG_TYPE_LWT_IN, 7151 }, 7152 { 7153 "bounds checks mixing signed and unsigned, positive bounds", 7154 .insns = { 7155 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7156 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7157 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7158 BPF_LD_MAP_FD(BPF_REG_1, 0), 7159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7160 BPF_FUNC_map_lookup_elem), 7161 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7162 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7163 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7164 BPF_MOV64_IMM(BPF_REG_2, 2), 7165 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 3), 7166 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 4, 2), 7167 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7168 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7169 BPF_MOV64_IMM(BPF_REG_0, 0), 7170 BPF_EXIT_INSN(), 7171 }, 7172 .fixup_map1 = { 3 }, 7173 .errstr = "unbounded min value", 7174 .result = REJECT, 7175 }, 7176 { 7177 "bounds checks mixing signed and unsigned", 7178 .insns = { 7179 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7180 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7181 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7182 BPF_LD_MAP_FD(BPF_REG_1, 0), 7183 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7184 BPF_FUNC_map_lookup_elem), 7185 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7186 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7187 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7188 BPF_MOV64_IMM(BPF_REG_2, -1), 7189 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 7190 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7191 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7192 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7193 BPF_MOV64_IMM(BPF_REG_0, 0), 7194 BPF_EXIT_INSN(), 7195 }, 7196 .fixup_map1 = { 3 }, 7197 .errstr = "unbounded min value", 7198 .result = REJECT, 7199 }, 7200 { 7201 "bounds checks mixing signed and unsigned, variant 2", 7202 .insns = { 7203 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7204 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7205 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7206 BPF_LD_MAP_FD(BPF_REG_1, 0), 7207 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7208 BPF_FUNC_map_lookup_elem), 7209 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7210 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7211 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7212 BPF_MOV64_IMM(BPF_REG_2, -1), 7213 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 7214 BPF_MOV64_IMM(BPF_REG_8, 0), 7215 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_1), 7216 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 7217 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 7218 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 7219 BPF_MOV64_IMM(BPF_REG_0, 0), 7220 BPF_EXIT_INSN(), 7221 }, 7222 .fixup_map1 = { 3 }, 7223 .errstr = "unbounded min value", 7224 .result = REJECT, 7225 }, 7226 { 7227 "bounds checks mixing signed and unsigned, variant 3", 7228 .insns = { 7229 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7230 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7231 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7232 BPF_LD_MAP_FD(BPF_REG_1, 0), 7233 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7234 BPF_FUNC_map_lookup_elem), 7235 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7236 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7237 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7238 BPF_MOV64_IMM(BPF_REG_2, -1), 7239 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 4), 7240 BPF_MOV64_REG(BPF_REG_8, BPF_REG_1), 7241 BPF_JMP_IMM(BPF_JSGT, BPF_REG_8, 1, 2), 7242 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_8), 7243 BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0), 7244 BPF_MOV64_IMM(BPF_REG_0, 0), 7245 BPF_EXIT_INSN(), 7246 }, 7247 .fixup_map1 = { 3 }, 7248 .errstr = "unbounded min value", 7249 .result = REJECT, 7250 }, 7251 { 7252 "bounds checks mixing signed and unsigned, variant 4", 7253 .insns = { 7254 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7255 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7256 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7257 BPF_LD_MAP_FD(BPF_REG_1, 0), 7258 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7259 BPF_FUNC_map_lookup_elem), 7260 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7261 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7262 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7263 BPF_MOV64_IMM(BPF_REG_2, 1), 7264 BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), 7265 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7266 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7267 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7268 BPF_MOV64_IMM(BPF_REG_0, 0), 7269 BPF_EXIT_INSN(), 7270 }, 7271 .fixup_map1 = { 3 }, 7272 .result = ACCEPT, 7273 }, 7274 { 7275 "bounds checks mixing signed and unsigned, variant 5", 7276 .insns = { 7277 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7278 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7279 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7280 BPF_LD_MAP_FD(BPF_REG_1, 0), 7281 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7282 BPF_FUNC_map_lookup_elem), 7283 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7284 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7285 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7286 BPF_MOV64_IMM(BPF_REG_2, -1), 7287 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 5), 7288 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 4), 7289 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 4), 7290 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 7291 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7292 BPF_MOV64_IMM(BPF_REG_0, 0), 7293 BPF_EXIT_INSN(), 7294 }, 7295 .fixup_map1 = { 3 }, 7296 .errstr = "unbounded min value", 7297 .result = REJECT, 7298 }, 7299 { 7300 "bounds checks mixing signed and unsigned, variant 6", 7301 .insns = { 7302 BPF_MOV64_IMM(BPF_REG_2, 0), 7303 BPF_MOV64_REG(BPF_REG_3, BPF_REG_10), 7304 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, -512), 7305 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7306 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -16), 7307 BPF_MOV64_IMM(BPF_REG_6, -1), 7308 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_6, 5), 7309 BPF_JMP_IMM(BPF_JSGT, BPF_REG_4, 1, 4), 7310 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 7311 BPF_MOV64_IMM(BPF_REG_5, 0), 7312 BPF_ST_MEM(BPF_H, BPF_REG_10, -512, 0), 7313 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7314 BPF_FUNC_skb_load_bytes), 7315 BPF_MOV64_IMM(BPF_REG_0, 0), 7316 BPF_EXIT_INSN(), 7317 }, 7318 .errstr = "R4 min value is negative, either use unsigned", 7319 .result = REJECT, 7320 }, 7321 { 7322 "bounds checks mixing signed and unsigned, variant 7", 7323 .insns = { 7324 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7325 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7326 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7327 BPF_LD_MAP_FD(BPF_REG_1, 0), 7328 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7329 BPF_FUNC_map_lookup_elem), 7330 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), 7331 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7332 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7333 BPF_MOV64_IMM(BPF_REG_2, 1024 * 1024 * 1024), 7334 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, 3), 7335 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7336 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7337 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7338 BPF_MOV64_IMM(BPF_REG_0, 0), 7339 BPF_EXIT_INSN(), 7340 }, 7341 .fixup_map1 = { 3 }, 7342 .result = ACCEPT, 7343 }, 7344 { 7345 "bounds checks mixing signed and unsigned, variant 8", 7346 .insns = { 7347 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7348 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7349 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7350 BPF_LD_MAP_FD(BPF_REG_1, 0), 7351 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7352 BPF_FUNC_map_lookup_elem), 7353 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7354 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7355 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7356 BPF_MOV64_IMM(BPF_REG_2, -1), 7357 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 7358 BPF_MOV64_IMM(BPF_REG_0, 0), 7359 BPF_EXIT_INSN(), 7360 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7361 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7362 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7363 BPF_MOV64_IMM(BPF_REG_0, 0), 7364 BPF_EXIT_INSN(), 7365 }, 7366 .fixup_map1 = { 3 }, 7367 .errstr = "unbounded min value", 7368 .result = REJECT, 7369 }, 7370 { 7371 "bounds checks mixing signed and unsigned, variant 9", 7372 .insns = { 7373 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7374 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7375 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7376 BPF_LD_MAP_FD(BPF_REG_1, 0), 7377 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7378 BPF_FUNC_map_lookup_elem), 7379 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10), 7380 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7381 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7382 BPF_LD_IMM64(BPF_REG_2, -9223372036854775808ULL), 7383 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 7384 BPF_MOV64_IMM(BPF_REG_0, 0), 7385 BPF_EXIT_INSN(), 7386 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7387 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7388 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7389 BPF_MOV64_IMM(BPF_REG_0, 0), 7390 BPF_EXIT_INSN(), 7391 }, 7392 .fixup_map1 = { 3 }, 7393 .result = ACCEPT, 7394 }, 7395 { 7396 "bounds checks mixing signed and unsigned, variant 10", 7397 .insns = { 7398 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7399 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7400 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7401 BPF_LD_MAP_FD(BPF_REG_1, 0), 7402 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7403 BPF_FUNC_map_lookup_elem), 7404 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7405 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7406 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7407 BPF_MOV64_IMM(BPF_REG_2, 0), 7408 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 2), 7409 BPF_MOV64_IMM(BPF_REG_0, 0), 7410 BPF_EXIT_INSN(), 7411 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7412 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7413 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7414 BPF_MOV64_IMM(BPF_REG_0, 0), 7415 BPF_EXIT_INSN(), 7416 }, 7417 .fixup_map1 = { 3 }, 7418 .errstr = "unbounded min value", 7419 .result = REJECT, 7420 }, 7421 { 7422 "bounds checks mixing signed and unsigned, variant 11", 7423 .insns = { 7424 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7425 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7426 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7427 BPF_LD_MAP_FD(BPF_REG_1, 0), 7428 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7429 BPF_FUNC_map_lookup_elem), 7430 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7431 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7432 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7433 BPF_MOV64_IMM(BPF_REG_2, -1), 7434 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 7435 /* Dead branch. */ 7436 BPF_MOV64_IMM(BPF_REG_0, 0), 7437 BPF_EXIT_INSN(), 7438 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7439 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7440 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7441 BPF_MOV64_IMM(BPF_REG_0, 0), 7442 BPF_EXIT_INSN(), 7443 }, 7444 .fixup_map1 = { 3 }, 7445 .errstr = "unbounded min value", 7446 .result = REJECT, 7447 }, 7448 { 7449 "bounds checks mixing signed and unsigned, variant 12", 7450 .insns = { 7451 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7452 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7453 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7454 BPF_LD_MAP_FD(BPF_REG_1, 0), 7455 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7456 BPF_FUNC_map_lookup_elem), 7457 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7458 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7459 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7460 BPF_MOV64_IMM(BPF_REG_2, -6), 7461 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 7462 BPF_MOV64_IMM(BPF_REG_0, 0), 7463 BPF_EXIT_INSN(), 7464 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7465 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7466 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7467 BPF_MOV64_IMM(BPF_REG_0, 0), 7468 BPF_EXIT_INSN(), 7469 }, 7470 .fixup_map1 = { 3 }, 7471 .errstr = "unbounded min value", 7472 .result = REJECT, 7473 }, 7474 { 7475 "bounds checks mixing signed and unsigned, variant 13", 7476 .insns = { 7477 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7478 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7479 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7480 BPF_LD_MAP_FD(BPF_REG_1, 0), 7481 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7482 BPF_FUNC_map_lookup_elem), 7483 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7484 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7485 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7486 BPF_MOV64_IMM(BPF_REG_2, 2), 7487 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 7488 BPF_MOV64_IMM(BPF_REG_7, 1), 7489 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 0, 2), 7490 BPF_MOV64_IMM(BPF_REG_0, 0), 7491 BPF_EXIT_INSN(), 7492 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_1), 7493 BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, 4, 2), 7494 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_7), 7495 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7496 BPF_MOV64_IMM(BPF_REG_0, 0), 7497 BPF_EXIT_INSN(), 7498 }, 7499 .fixup_map1 = { 3 }, 7500 .errstr = "unbounded min value", 7501 .result = REJECT, 7502 }, 7503 { 7504 "bounds checks mixing signed and unsigned, variant 14", 7505 .insns = { 7506 BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_1, 7507 offsetof(struct __sk_buff, mark)), 7508 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7509 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7510 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7511 BPF_LD_MAP_FD(BPF_REG_1, 0), 7512 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7513 BPF_FUNC_map_lookup_elem), 7514 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7515 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7516 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7517 BPF_MOV64_IMM(BPF_REG_2, -1), 7518 BPF_MOV64_IMM(BPF_REG_8, 2), 7519 BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 42, 6), 7520 BPF_JMP_REG(BPF_JSGT, BPF_REG_8, BPF_REG_1, 3), 7521 BPF_JMP_IMM(BPF_JSGT, BPF_REG_1, 1, 2), 7522 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7523 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7524 BPF_MOV64_IMM(BPF_REG_0, 0), 7525 BPF_EXIT_INSN(), 7526 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_2, -3), 7527 BPF_JMP_IMM(BPF_JA, 0, 0, -7), 7528 }, 7529 .fixup_map1 = { 4 }, 7530 .errstr = "R0 invalid mem access 'inv'", 7531 .result = REJECT, 7532 }, 7533 { 7534 "bounds checks mixing signed and unsigned, variant 15", 7535 .insns = { 7536 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7537 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7538 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7539 BPF_LD_MAP_FD(BPF_REG_1, 0), 7540 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7541 BPF_FUNC_map_lookup_elem), 7542 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7543 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, -8), 7544 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -16), 7545 BPF_MOV64_IMM(BPF_REG_2, -6), 7546 BPF_JMP_REG(BPF_JGE, BPF_REG_2, BPF_REG_1, 2), 7547 BPF_MOV64_IMM(BPF_REG_0, 0), 7548 BPF_EXIT_INSN(), 7549 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7550 BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 1, 2), 7551 BPF_MOV64_IMM(BPF_REG_0, 0), 7552 BPF_EXIT_INSN(), 7553 BPF_ST_MEM(BPF_B, BPF_REG_0, 0, 0), 7554 BPF_MOV64_IMM(BPF_REG_0, 0), 7555 BPF_EXIT_INSN(), 7556 }, 7557 .fixup_map1 = { 3 }, 7558 .errstr = "unbounded min value", 7559 .result = REJECT, 7560 .result_unpriv = REJECT, 7561 }, 7562 { 7563 "subtraction bounds (map value) variant 1", 7564 .insns = { 7565 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7566 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7567 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7568 BPF_LD_MAP_FD(BPF_REG_1, 0), 7569 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7570 BPF_FUNC_map_lookup_elem), 7571 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7572 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7573 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 7), 7574 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 7575 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 5), 7576 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 7577 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 56), 7578 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7579 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7580 BPF_EXIT_INSN(), 7581 BPF_MOV64_IMM(BPF_REG_0, 0), 7582 BPF_EXIT_INSN(), 7583 }, 7584 .fixup_map1 = { 3 }, 7585 .errstr = "R0 max value is outside of the array range", 7586 .result = REJECT, 7587 }, 7588 { 7589 "subtraction bounds (map value) variant 2", 7590 .insns = { 7591 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7592 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7593 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7594 BPF_LD_MAP_FD(BPF_REG_1, 0), 7595 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7596 BPF_FUNC_map_lookup_elem), 7597 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 7598 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7599 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 0xff, 6), 7600 BPF_LDX_MEM(BPF_B, BPF_REG_3, BPF_REG_0, 1), 7601 BPF_JMP_IMM(BPF_JGT, BPF_REG_3, 0xff, 4), 7602 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_3), 7603 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7604 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7605 BPF_EXIT_INSN(), 7606 BPF_MOV64_IMM(BPF_REG_0, 0), 7607 BPF_EXIT_INSN(), 7608 }, 7609 .fixup_map1 = { 3 }, 7610 .errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.", 7611 .result = REJECT, 7612 }, 7613 { 7614 "bounds check based on zero-extended MOV", 7615 .insns = { 7616 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7617 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7618 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7619 BPF_LD_MAP_FD(BPF_REG_1, 0), 7620 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7621 BPF_FUNC_map_lookup_elem), 7622 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7623 /* r2 = 0x0000'0000'ffff'ffff */ 7624 BPF_MOV32_IMM(BPF_REG_2, 0xffffffff), 7625 /* r2 = 0 */ 7626 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 7627 /* no-op */ 7628 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 7629 /* access at offset 0 */ 7630 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7631 /* exit */ 7632 BPF_MOV64_IMM(BPF_REG_0, 0), 7633 BPF_EXIT_INSN(), 7634 }, 7635 .fixup_map1 = { 3 }, 7636 .result = ACCEPT 7637 }, 7638 { 7639 "bounds check based on sign-extended MOV. test1", 7640 .insns = { 7641 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7642 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7643 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7644 BPF_LD_MAP_FD(BPF_REG_1, 0), 7645 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7646 BPF_FUNC_map_lookup_elem), 7647 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7648 /* r2 = 0xffff'ffff'ffff'ffff */ 7649 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 7650 /* r2 = 0xffff'ffff */ 7651 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), 7652 /* r0 = <oob pointer> */ 7653 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 7654 /* access to OOB pointer */ 7655 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7656 /* exit */ 7657 BPF_MOV64_IMM(BPF_REG_0, 0), 7658 BPF_EXIT_INSN(), 7659 }, 7660 .fixup_map1 = { 3 }, 7661 .errstr = "map_value pointer and 4294967295", 7662 .result = REJECT 7663 }, 7664 { 7665 "bounds check based on sign-extended MOV. test2", 7666 .insns = { 7667 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7668 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7669 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7670 BPF_LD_MAP_FD(BPF_REG_1, 0), 7671 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7672 BPF_FUNC_map_lookup_elem), 7673 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7674 /* r2 = 0xffff'ffff'ffff'ffff */ 7675 BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), 7676 /* r2 = 0xfff'ffff */ 7677 BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36), 7678 /* r0 = <oob pointer> */ 7679 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 7680 /* access to OOB pointer */ 7681 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7682 /* exit */ 7683 BPF_MOV64_IMM(BPF_REG_0, 0), 7684 BPF_EXIT_INSN(), 7685 }, 7686 .fixup_map1 = { 3 }, 7687 .errstr = "R0 min value is outside of the array range", 7688 .result = REJECT 7689 }, 7690 { 7691 "bounds check based on reg_off + var_off + insn_off. test1", 7692 .insns = { 7693 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 7694 offsetof(struct __sk_buff, mark)), 7695 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7696 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7697 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7698 BPF_LD_MAP_FD(BPF_REG_1, 0), 7699 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7700 BPF_FUNC_map_lookup_elem), 7701 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7702 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 7703 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1), 7704 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 7705 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 7706 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 7707 BPF_MOV64_IMM(BPF_REG_0, 0), 7708 BPF_EXIT_INSN(), 7709 }, 7710 .fixup_map1 = { 4 }, 7711 .errstr = "value_size=8 off=1073741825", 7712 .result = REJECT, 7713 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7714 }, 7715 { 7716 "bounds check based on reg_off + var_off + insn_off. test2", 7717 .insns = { 7718 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 7719 offsetof(struct __sk_buff, mark)), 7720 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7721 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7722 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7723 BPF_LD_MAP_FD(BPF_REG_1, 0), 7724 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7725 BPF_FUNC_map_lookup_elem), 7726 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), 7727 BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), 7728 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1), 7729 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), 7730 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), 7731 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), 7732 BPF_MOV64_IMM(BPF_REG_0, 0), 7733 BPF_EXIT_INSN(), 7734 }, 7735 .fixup_map1 = { 4 }, 7736 .errstr = "value 1073741823", 7737 .result = REJECT, 7738 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 7739 }, 7740 { 7741 "bounds check after truncation of non-boundary-crossing range", 7742 .insns = { 7743 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7744 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7745 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7746 BPF_LD_MAP_FD(BPF_REG_1, 0), 7747 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7748 BPF_FUNC_map_lookup_elem), 7749 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7750 /* r1 = [0x00, 0xff] */ 7751 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7752 BPF_MOV64_IMM(BPF_REG_2, 1), 7753 /* r2 = 0x10'0000'0000 */ 7754 BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36), 7755 /* r1 = [0x10'0000'0000, 0x10'0000'00ff] */ 7756 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 7757 /* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */ 7758 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 7759 /* r1 = [0x00, 0xff] */ 7760 BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff), 7761 /* r1 = 0 */ 7762 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 7763 /* no-op */ 7764 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7765 /* access at offset 0 */ 7766 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7767 /* exit */ 7768 BPF_MOV64_IMM(BPF_REG_0, 0), 7769 BPF_EXIT_INSN(), 7770 }, 7771 .fixup_map1 = { 3 }, 7772 .result = ACCEPT 7773 }, 7774 { 7775 "bounds check after truncation of boundary-crossing range (1)", 7776 .insns = { 7777 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7778 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7779 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7780 BPF_LD_MAP_FD(BPF_REG_1, 0), 7781 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7782 BPF_FUNC_map_lookup_elem), 7783 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7784 /* r1 = [0x00, 0xff] */ 7785 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7786 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 7787 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 7788 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 7789 /* r1 = [0xffff'ff80, 0xffff'ffff] or 7790 * [0x0000'0000, 0x0000'007f] 7791 */ 7792 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0), 7793 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 7794 /* r1 = [0x00, 0xff] or 7795 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 7796 */ 7797 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 7798 /* r1 = 0 or 7799 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 7800 */ 7801 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 7802 /* no-op or OOB pointer computation */ 7803 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7804 /* potentially OOB access */ 7805 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7806 /* exit */ 7807 BPF_MOV64_IMM(BPF_REG_0, 0), 7808 BPF_EXIT_INSN(), 7809 }, 7810 .fixup_map1 = { 3 }, 7811 /* not actually fully unbounded, but the bound is very high */ 7812 .errstr = "R0 unbounded memory access", 7813 .result = REJECT 7814 }, 7815 { 7816 "bounds check after truncation of boundary-crossing range (2)", 7817 .insns = { 7818 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7819 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7820 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7821 BPF_LD_MAP_FD(BPF_REG_1, 0), 7822 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7823 BPF_FUNC_map_lookup_elem), 7824 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), 7825 /* r1 = [0x00, 0xff] */ 7826 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7827 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 7828 /* r1 = [0xffff'ff80, 0x1'0000'007f] */ 7829 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), 7830 /* r1 = [0xffff'ff80, 0xffff'ffff] or 7831 * [0x0000'0000, 0x0000'007f] 7832 * difference to previous test: truncation via MOV32 7833 * instead of ALU32. 7834 */ 7835 BPF_MOV32_REG(BPF_REG_1, BPF_REG_1), 7836 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 7837 /* r1 = [0x00, 0xff] or 7838 * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] 7839 */ 7840 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), 7841 /* r1 = 0 or 7842 * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] 7843 */ 7844 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 7845 /* no-op or OOB pointer computation */ 7846 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7847 /* potentially OOB access */ 7848 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7849 /* exit */ 7850 BPF_MOV64_IMM(BPF_REG_0, 0), 7851 BPF_EXIT_INSN(), 7852 }, 7853 .fixup_map1 = { 3 }, 7854 /* not actually fully unbounded, but the bound is very high */ 7855 .errstr = "R0 unbounded memory access", 7856 .result = REJECT 7857 }, 7858 { 7859 "bounds check after wrapping 32-bit addition", 7860 .insns = { 7861 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7862 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7863 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7864 BPF_LD_MAP_FD(BPF_REG_1, 0), 7865 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7866 BPF_FUNC_map_lookup_elem), 7867 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), 7868 /* r1 = 0x7fff'ffff */ 7869 BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff), 7870 /* r1 = 0xffff'fffe */ 7871 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 7872 /* r1 = 0 */ 7873 BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2), 7874 /* no-op */ 7875 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7876 /* access at offset 0 */ 7877 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7878 /* exit */ 7879 BPF_MOV64_IMM(BPF_REG_0, 0), 7880 BPF_EXIT_INSN(), 7881 }, 7882 .fixup_map1 = { 3 }, 7883 .result = ACCEPT 7884 }, 7885 { 7886 "bounds check after shift with oversized count operand", 7887 .insns = { 7888 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7889 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7890 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7891 BPF_LD_MAP_FD(BPF_REG_1, 0), 7892 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7893 BPF_FUNC_map_lookup_elem), 7894 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7895 BPF_MOV64_IMM(BPF_REG_2, 32), 7896 BPF_MOV64_IMM(BPF_REG_1, 1), 7897 /* r1 = (u32)1 << (u32)32 = ? */ 7898 BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 7899 /* r1 = [0x0000, 0xffff] */ 7900 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff), 7901 /* computes unknown pointer, potentially OOB */ 7902 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7903 /* potentially OOB access */ 7904 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7905 /* exit */ 7906 BPF_MOV64_IMM(BPF_REG_0, 0), 7907 BPF_EXIT_INSN(), 7908 }, 7909 .fixup_map1 = { 3 }, 7910 .errstr = "R0 max value is outside of the array range", 7911 .result = REJECT 7912 }, 7913 { 7914 "bounds check after right shift of maybe-negative number", 7915 .insns = { 7916 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7917 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7918 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7919 BPF_LD_MAP_FD(BPF_REG_1, 0), 7920 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7921 BPF_FUNC_map_lookup_elem), 7922 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), 7923 /* r1 = [0x00, 0xff] */ 7924 BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 7925 /* r1 = [-0x01, 0xfe] */ 7926 BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 7927 /* r1 = 0 or 0xff'ffff'ffff'ffff */ 7928 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 7929 /* r1 = 0 or 0xffff'ffff'ffff */ 7930 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), 7931 /* computes unknown pointer, potentially OOB */ 7932 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 7933 /* potentially OOB access */ 7934 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 7935 /* exit */ 7936 BPF_MOV64_IMM(BPF_REG_0, 0), 7937 BPF_EXIT_INSN(), 7938 }, 7939 .fixup_map1 = { 3 }, 7940 .errstr = "R0 unbounded memory access", 7941 .result = REJECT 7942 }, 7943 { 7944 "bounds check map access with off+size signed 32bit overflow. test1", 7945 .insns = { 7946 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7947 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7948 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7949 BPF_LD_MAP_FD(BPF_REG_1, 0), 7950 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7951 BPF_FUNC_map_lookup_elem), 7952 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 7953 BPF_EXIT_INSN(), 7954 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe), 7955 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 7956 BPF_JMP_A(0), 7957 BPF_EXIT_INSN(), 7958 }, 7959 .fixup_map1 = { 3 }, 7960 .errstr = "map_value pointer and 2147483646", 7961 .result = REJECT 7962 }, 7963 { 7964 "bounds check map access with off+size signed 32bit overflow. test2", 7965 .insns = { 7966 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7967 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7968 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7969 BPF_LD_MAP_FD(BPF_REG_1, 0), 7970 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7971 BPF_FUNC_map_lookup_elem), 7972 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 7973 BPF_EXIT_INSN(), 7974 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 7975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 7976 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), 7977 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 7978 BPF_JMP_A(0), 7979 BPF_EXIT_INSN(), 7980 }, 7981 .fixup_map1 = { 3 }, 7982 .errstr = "pointer offset 1073741822", 7983 .result = REJECT 7984 }, 7985 { 7986 "bounds check map access with off+size signed 32bit overflow. test3", 7987 .insns = { 7988 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7989 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7990 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 7991 BPF_LD_MAP_FD(BPF_REG_1, 0), 7992 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 7993 BPF_FUNC_map_lookup_elem), 7994 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 7995 BPF_EXIT_INSN(), 7996 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 7997 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), 7998 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 7999 BPF_JMP_A(0), 8000 BPF_EXIT_INSN(), 8001 }, 8002 .fixup_map1 = { 3 }, 8003 .errstr = "pointer offset -1073741822", 8004 .result = REJECT 8005 }, 8006 { 8007 "bounds check map access with off+size signed 32bit overflow. test4", 8008 .insns = { 8009 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8010 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8011 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8012 BPF_LD_MAP_FD(BPF_REG_1, 0), 8013 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8014 BPF_FUNC_map_lookup_elem), 8015 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 8016 BPF_EXIT_INSN(), 8017 BPF_MOV64_IMM(BPF_REG_1, 1000000), 8018 BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000), 8019 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8020 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), 8021 BPF_JMP_A(0), 8022 BPF_EXIT_INSN(), 8023 }, 8024 .fixup_map1 = { 3 }, 8025 .errstr = "map_value pointer and 1000000000000", 8026 .result = REJECT 8027 }, 8028 { 8029 "pointer/scalar confusion in state equality check (way 1)", 8030 .insns = { 8031 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8032 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8033 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8034 BPF_LD_MAP_FD(BPF_REG_1, 0), 8035 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8036 BPF_FUNC_map_lookup_elem), 8037 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 8038 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 8039 BPF_JMP_A(1), 8040 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 8041 BPF_JMP_A(0), 8042 BPF_EXIT_INSN(), 8043 }, 8044 .fixup_map1 = { 3 }, 8045 .result = ACCEPT, 8046 .retval = POINTER_VALUE, 8047 .result_unpriv = REJECT, 8048 .errstr_unpriv = "R0 leaks addr as return value" 8049 }, 8050 { 8051 "pointer/scalar confusion in state equality check (way 2)", 8052 .insns = { 8053 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8054 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8055 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8056 BPF_LD_MAP_FD(BPF_REG_1, 0), 8057 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8058 BPF_FUNC_map_lookup_elem), 8059 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 8060 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 8061 BPF_JMP_A(1), 8062 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), 8063 BPF_EXIT_INSN(), 8064 }, 8065 .fixup_map1 = { 3 }, 8066 .result = ACCEPT, 8067 .retval = POINTER_VALUE, 8068 .result_unpriv = REJECT, 8069 .errstr_unpriv = "R0 leaks addr as return value" 8070 }, 8071 { 8072 "variable-offset ctx access", 8073 .insns = { 8074 /* Get an unknown value */ 8075 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 8076 /* Make it small and 4-byte aligned */ 8077 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 8078 /* add it to skb. We now have either &skb->len or 8079 * &skb->pkt_type, but we don't know which 8080 */ 8081 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 8082 /* dereference it */ 8083 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 8084 BPF_EXIT_INSN(), 8085 }, 8086 .errstr = "variable ctx access var_off=(0x0; 0x4)", 8087 .result = REJECT, 8088 .prog_type = BPF_PROG_TYPE_LWT_IN, 8089 }, 8090 { 8091 "variable-offset stack access", 8092 .insns = { 8093 /* Fill the top 8 bytes of the stack */ 8094 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8095 /* Get an unknown value */ 8096 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 8097 /* Make it small and 4-byte aligned */ 8098 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 8099 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 8100 /* add it to fp. We now have either fp-4 or fp-8, but 8101 * we don't know which 8102 */ 8103 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 8104 /* dereference it */ 8105 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 0), 8106 BPF_EXIT_INSN(), 8107 }, 8108 .errstr = "variable stack access var_off=(0xfffffffffffffff8; 0x4)", 8109 .result = REJECT, 8110 .prog_type = BPF_PROG_TYPE_LWT_IN, 8111 }, 8112 { 8113 "indirect variable-offset stack access", 8114 .insns = { 8115 /* Fill the top 8 bytes of the stack */ 8116 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8117 /* Get an unknown value */ 8118 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 8119 /* Make it small and 4-byte aligned */ 8120 BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), 8121 BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), 8122 /* add it to fp. We now have either fp-4 or fp-8, but 8123 * we don't know which 8124 */ 8125 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), 8126 /* dereference it indirectly */ 8127 BPF_LD_MAP_FD(BPF_REG_1, 0), 8128 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8129 BPF_FUNC_map_lookup_elem), 8130 BPF_MOV64_IMM(BPF_REG_0, 0), 8131 BPF_EXIT_INSN(), 8132 }, 8133 .fixup_map1 = { 5 }, 8134 .errstr = "variable stack read R2", 8135 .result = REJECT, 8136 .prog_type = BPF_PROG_TYPE_LWT_IN, 8137 }, 8138 { 8139 "direct stack access with 32-bit wraparound. test1", 8140 .insns = { 8141 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8142 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 8143 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), 8144 BPF_MOV32_IMM(BPF_REG_0, 0), 8145 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8146 BPF_EXIT_INSN() 8147 }, 8148 .errstr = "fp pointer and 2147483647", 8149 .result = REJECT 8150 }, 8151 { 8152 "direct stack access with 32-bit wraparound. test2", 8153 .insns = { 8154 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8155 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 8156 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), 8157 BPF_MOV32_IMM(BPF_REG_0, 0), 8158 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8159 BPF_EXIT_INSN() 8160 }, 8161 .errstr = "fp pointer and 1073741823", 8162 .result = REJECT 8163 }, 8164 { 8165 "direct stack access with 32-bit wraparound. test3", 8166 .insns = { 8167 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 8168 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 8169 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), 8170 BPF_MOV32_IMM(BPF_REG_0, 0), 8171 BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), 8172 BPF_EXIT_INSN() 8173 }, 8174 .errstr = "fp pointer offset 1073741822", 8175 .result = REJECT 8176 }, 8177 { 8178 "liveness pruning and write screening", 8179 .insns = { 8180 /* Get an unknown value */ 8181 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), 8182 /* branch conditions teach us nothing about R2 */ 8183 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 8184 BPF_MOV64_IMM(BPF_REG_0, 0), 8185 BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1), 8186 BPF_MOV64_IMM(BPF_REG_0, 0), 8187 BPF_EXIT_INSN(), 8188 }, 8189 .errstr = "R0 !read_ok", 8190 .result = REJECT, 8191 .prog_type = BPF_PROG_TYPE_LWT_IN, 8192 }, 8193 { 8194 "varlen_map_value_access pruning", 8195 .insns = { 8196 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 8197 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 8198 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8199 BPF_LD_MAP_FD(BPF_REG_1, 0), 8200 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8201 BPF_FUNC_map_lookup_elem), 8202 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 8203 BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), 8204 BPF_MOV32_IMM(BPF_REG_2, MAX_ENTRIES), 8205 BPF_JMP_REG(BPF_JSGT, BPF_REG_2, BPF_REG_1, 1), 8206 BPF_MOV32_IMM(BPF_REG_1, 0), 8207 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 2), 8208 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), 8209 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 8210 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 8211 offsetof(struct test_val, foo)), 8212 BPF_EXIT_INSN(), 8213 }, 8214 .fixup_map2 = { 3 }, 8215 .errstr_unpriv = "R0 leaks addr", 8216 .errstr = "R0 unbounded memory access", 8217 .result_unpriv = REJECT, 8218 .result = REJECT, 8219 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8220 }, 8221 { 8222 "invalid 64-bit BPF_END", 8223 .insns = { 8224 BPF_MOV32_IMM(BPF_REG_0, 0), 8225 { 8226 .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 8227 .dst_reg = BPF_REG_0, 8228 .src_reg = 0, 8229 .off = 0, 8230 .imm = 32, 8231 }, 8232 BPF_EXIT_INSN(), 8233 }, 8234 .errstr = "unknown opcode d7", 8235 .result = REJECT, 8236 }, 8237 { 8238 "XDP, using ifindex from netdev", 8239 .insns = { 8240 BPF_MOV64_IMM(BPF_REG_0, 0), 8241 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8242 offsetof(struct xdp_md, ingress_ifindex)), 8243 BPF_JMP_IMM(BPF_JLT, BPF_REG_2, 1, 1), 8244 BPF_MOV64_IMM(BPF_REG_0, 1), 8245 BPF_EXIT_INSN(), 8246 }, 8247 .result = ACCEPT, 8248 .prog_type = BPF_PROG_TYPE_XDP, 8249 .retval = 1, 8250 }, 8251 { 8252 "meta access, test1", 8253 .insns = { 8254 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8255 offsetof(struct xdp_md, data_meta)), 8256 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8257 offsetof(struct xdp_md, data)), 8258 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8259 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8260 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 8261 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8262 BPF_MOV64_IMM(BPF_REG_0, 0), 8263 BPF_EXIT_INSN(), 8264 }, 8265 .result = ACCEPT, 8266 .prog_type = BPF_PROG_TYPE_XDP, 8267 }, 8268 { 8269 "meta access, test2", 8270 .insns = { 8271 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8272 offsetof(struct xdp_md, data_meta)), 8273 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8274 offsetof(struct xdp_md, data)), 8275 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8276 BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 8), 8277 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 8278 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 8279 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 8280 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 8281 BPF_MOV64_IMM(BPF_REG_0, 0), 8282 BPF_EXIT_INSN(), 8283 }, 8284 .result = REJECT, 8285 .errstr = "invalid access to packet, off=-8", 8286 .prog_type = BPF_PROG_TYPE_XDP, 8287 }, 8288 { 8289 "meta access, test3", 8290 .insns = { 8291 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8292 offsetof(struct xdp_md, data_meta)), 8293 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8294 offsetof(struct xdp_md, data_end)), 8295 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 8296 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8297 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 8298 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8299 BPF_MOV64_IMM(BPF_REG_0, 0), 8300 BPF_EXIT_INSN(), 8301 }, 8302 .result = REJECT, 8303 .errstr = "invalid access to packet", 8304 .prog_type = BPF_PROG_TYPE_XDP, 8305 }, 8306 { 8307 "meta access, test4", 8308 .insns = { 8309 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8310 offsetof(struct xdp_md, data_meta)), 8311 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8312 offsetof(struct xdp_md, data_end)), 8313 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 8314 offsetof(struct xdp_md, data)), 8315 BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), 8316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8317 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1), 8318 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8319 BPF_MOV64_IMM(BPF_REG_0, 0), 8320 BPF_EXIT_INSN(), 8321 }, 8322 .result = REJECT, 8323 .errstr = "invalid access to packet", 8324 .prog_type = BPF_PROG_TYPE_XDP, 8325 }, 8326 { 8327 "meta access, test5", 8328 .insns = { 8329 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8330 offsetof(struct xdp_md, data_meta)), 8331 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 8332 offsetof(struct xdp_md, data)), 8333 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8334 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8335 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_4, 3), 8336 BPF_MOV64_IMM(BPF_REG_2, -8), 8337 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 8338 BPF_FUNC_xdp_adjust_meta), 8339 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 8340 BPF_MOV64_IMM(BPF_REG_0, 0), 8341 BPF_EXIT_INSN(), 8342 }, 8343 .result = REJECT, 8344 .errstr = "R3 !read_ok", 8345 .prog_type = BPF_PROG_TYPE_XDP, 8346 }, 8347 { 8348 "meta access, test6", 8349 .insns = { 8350 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8351 offsetof(struct xdp_md, data_meta)), 8352 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8353 offsetof(struct xdp_md, data)), 8354 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8355 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8356 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 8357 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 8358 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_0, 1), 8359 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8360 BPF_MOV64_IMM(BPF_REG_0, 0), 8361 BPF_EXIT_INSN(), 8362 }, 8363 .result = REJECT, 8364 .errstr = "invalid access to packet", 8365 .prog_type = BPF_PROG_TYPE_XDP, 8366 }, 8367 { 8368 "meta access, test7", 8369 .insns = { 8370 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8371 offsetof(struct xdp_md, data_meta)), 8372 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8373 offsetof(struct xdp_md, data)), 8374 BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), 8375 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 8376 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 8377 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 8), 8378 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 8379 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8380 BPF_MOV64_IMM(BPF_REG_0, 0), 8381 BPF_EXIT_INSN(), 8382 }, 8383 .result = ACCEPT, 8384 .prog_type = BPF_PROG_TYPE_XDP, 8385 }, 8386 { 8387 "meta access, test8", 8388 .insns = { 8389 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8390 offsetof(struct xdp_md, data_meta)), 8391 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8392 offsetof(struct xdp_md, data)), 8393 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 8394 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 8395 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 8396 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8397 BPF_MOV64_IMM(BPF_REG_0, 0), 8398 BPF_EXIT_INSN(), 8399 }, 8400 .result = ACCEPT, 8401 .prog_type = BPF_PROG_TYPE_XDP, 8402 }, 8403 { 8404 "meta access, test9", 8405 .insns = { 8406 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8407 offsetof(struct xdp_md, data_meta)), 8408 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8409 offsetof(struct xdp_md, data)), 8410 BPF_MOV64_REG(BPF_REG_4, BPF_REG_2), 8411 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 0xFFFF), 8412 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, 1), 8413 BPF_JMP_REG(BPF_JGT, BPF_REG_4, BPF_REG_3, 1), 8414 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8415 BPF_MOV64_IMM(BPF_REG_0, 0), 8416 BPF_EXIT_INSN(), 8417 }, 8418 .result = REJECT, 8419 .errstr = "invalid access to packet", 8420 .prog_type = BPF_PROG_TYPE_XDP, 8421 }, 8422 { 8423 "meta access, test10", 8424 .insns = { 8425 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8426 offsetof(struct xdp_md, data_meta)), 8427 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8428 offsetof(struct xdp_md, data)), 8429 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 8430 offsetof(struct xdp_md, data_end)), 8431 BPF_MOV64_IMM(BPF_REG_5, 42), 8432 BPF_MOV64_IMM(BPF_REG_6, 24), 8433 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 8434 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 8435 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 8436 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 8437 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_5), 8438 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 8439 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 8440 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 8441 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_5, 1), 8442 BPF_LDX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0), 8443 BPF_MOV64_IMM(BPF_REG_0, 0), 8444 BPF_EXIT_INSN(), 8445 }, 8446 .result = REJECT, 8447 .errstr = "invalid access to packet", 8448 .prog_type = BPF_PROG_TYPE_XDP, 8449 }, 8450 { 8451 "meta access, test11", 8452 .insns = { 8453 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8454 offsetof(struct xdp_md, data_meta)), 8455 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8456 offsetof(struct xdp_md, data)), 8457 BPF_MOV64_IMM(BPF_REG_5, 42), 8458 BPF_MOV64_IMM(BPF_REG_6, 24), 8459 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_5, -8), 8460 BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_6, -8), 8461 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -8), 8462 BPF_JMP_IMM(BPF_JGT, BPF_REG_5, 100, 6), 8463 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_5), 8464 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 8465 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 8466 BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 8), 8467 BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_3, 1), 8468 BPF_LDX_MEM(BPF_B, BPF_REG_5, BPF_REG_5, 0), 8469 BPF_MOV64_IMM(BPF_REG_0, 0), 8470 BPF_EXIT_INSN(), 8471 }, 8472 .result = ACCEPT, 8473 .prog_type = BPF_PROG_TYPE_XDP, 8474 }, 8475 { 8476 "meta access, test12", 8477 .insns = { 8478 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8479 offsetof(struct xdp_md, data_meta)), 8480 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8481 offsetof(struct xdp_md, data)), 8482 BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, 8483 offsetof(struct xdp_md, data_end)), 8484 BPF_MOV64_REG(BPF_REG_5, BPF_REG_3), 8485 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 8486 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_4, 5), 8487 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_3, 0), 8488 BPF_MOV64_REG(BPF_REG_5, BPF_REG_2), 8489 BPF_ALU64_IMM(BPF_ADD, BPF_REG_5, 16), 8490 BPF_JMP_REG(BPF_JGT, BPF_REG_5, BPF_REG_3, 1), 8491 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0), 8492 BPF_MOV64_IMM(BPF_REG_0, 0), 8493 BPF_EXIT_INSN(), 8494 }, 8495 .result = ACCEPT, 8496 .prog_type = BPF_PROG_TYPE_XDP, 8497 }, 8498 { 8499 "arithmetic ops make PTR_TO_CTX unusable", 8500 .insns = { 8501 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8502 offsetof(struct __sk_buff, data) - 8503 offsetof(struct __sk_buff, mark)), 8504 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 8505 offsetof(struct __sk_buff, mark)), 8506 BPF_EXIT_INSN(), 8507 }, 8508 .errstr = "dereference of modified ctx ptr R1 off=68+8, ctx+const is allowed, ctx+const+const is not", 8509 .result = REJECT, 8510 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8511 }, 8512 { 8513 "pkt_end - pkt_start is allowed", 8514 .insns = { 8515 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 8516 offsetof(struct __sk_buff, data_end)), 8517 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8518 offsetof(struct __sk_buff, data)), 8519 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), 8520 BPF_EXIT_INSN(), 8521 }, 8522 .result = ACCEPT, 8523 .retval = TEST_DATA_LEN, 8524 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 8525 }, 8526 { 8527 "XDP pkt read, pkt_end mangling, bad access 1", 8528 .insns = { 8529 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8530 offsetof(struct xdp_md, data)), 8531 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8532 offsetof(struct xdp_md, data_end)), 8533 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8534 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8535 BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, 8), 8536 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 8537 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8538 BPF_MOV64_IMM(BPF_REG_0, 0), 8539 BPF_EXIT_INSN(), 8540 }, 8541 .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", 8542 .result = REJECT, 8543 .prog_type = BPF_PROG_TYPE_XDP, 8544 }, 8545 { 8546 "XDP pkt read, pkt_end mangling, bad access 2", 8547 .insns = { 8548 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8549 offsetof(struct xdp_md, data)), 8550 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8551 offsetof(struct xdp_md, data_end)), 8552 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8553 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8554 BPF_ALU64_IMM(BPF_SUB, BPF_REG_3, 8), 8555 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 8556 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8557 BPF_MOV64_IMM(BPF_REG_0, 0), 8558 BPF_EXIT_INSN(), 8559 }, 8560 .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", 8561 .result = REJECT, 8562 .prog_type = BPF_PROG_TYPE_XDP, 8563 }, 8564 { 8565 "XDP pkt read, pkt_data' > pkt_end, good access", 8566 .insns = { 8567 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8568 offsetof(struct xdp_md, data)), 8569 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8570 offsetof(struct xdp_md, data_end)), 8571 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8572 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8573 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 8574 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8575 BPF_MOV64_IMM(BPF_REG_0, 0), 8576 BPF_EXIT_INSN(), 8577 }, 8578 .result = ACCEPT, 8579 .prog_type = BPF_PROG_TYPE_XDP, 8580 }, 8581 { 8582 "XDP pkt read, pkt_data' > pkt_end, bad access 1", 8583 .insns = { 8584 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8585 offsetof(struct xdp_md, data)), 8586 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8587 offsetof(struct xdp_md, data_end)), 8588 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8589 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8590 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 8591 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 8592 BPF_MOV64_IMM(BPF_REG_0, 0), 8593 BPF_EXIT_INSN(), 8594 }, 8595 .errstr = "R1 offset is outside of the packet", 8596 .result = REJECT, 8597 .prog_type = BPF_PROG_TYPE_XDP, 8598 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8599 }, 8600 { 8601 "XDP pkt read, pkt_data' > pkt_end, bad access 2", 8602 .insns = { 8603 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8604 offsetof(struct xdp_md, data)), 8605 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8606 offsetof(struct xdp_md, data_end)), 8607 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8608 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8609 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 8610 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8611 BPF_MOV64_IMM(BPF_REG_0, 0), 8612 BPF_EXIT_INSN(), 8613 }, 8614 .errstr = "R1 offset is outside of the packet", 8615 .result = REJECT, 8616 .prog_type = BPF_PROG_TYPE_XDP, 8617 }, 8618 { 8619 "XDP pkt read, pkt_end > pkt_data', good access", 8620 .insns = { 8621 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8622 offsetof(struct xdp_md, data)), 8623 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8624 offsetof(struct xdp_md, data_end)), 8625 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8626 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8627 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 8628 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8629 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8630 BPF_MOV64_IMM(BPF_REG_0, 0), 8631 BPF_EXIT_INSN(), 8632 }, 8633 .result = ACCEPT, 8634 .prog_type = BPF_PROG_TYPE_XDP, 8635 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8636 }, 8637 { 8638 "XDP pkt read, pkt_end > pkt_data', bad access 1", 8639 .insns = { 8640 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8641 offsetof(struct xdp_md, data)), 8642 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8643 offsetof(struct xdp_md, data_end)), 8644 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8645 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8646 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 8647 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8648 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8649 BPF_MOV64_IMM(BPF_REG_0, 0), 8650 BPF_EXIT_INSN(), 8651 }, 8652 .errstr = "R1 offset is outside of the packet", 8653 .result = REJECT, 8654 .prog_type = BPF_PROG_TYPE_XDP, 8655 }, 8656 { 8657 "XDP pkt read, pkt_end > pkt_data', bad access 2", 8658 .insns = { 8659 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8660 offsetof(struct xdp_md, data)), 8661 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8662 offsetof(struct xdp_md, data_end)), 8663 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8664 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8665 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 8666 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8667 BPF_MOV64_IMM(BPF_REG_0, 0), 8668 BPF_EXIT_INSN(), 8669 }, 8670 .errstr = "R1 offset is outside of the packet", 8671 .result = REJECT, 8672 .prog_type = BPF_PROG_TYPE_XDP, 8673 }, 8674 { 8675 "XDP pkt read, pkt_data' < pkt_end, good access", 8676 .insns = { 8677 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8678 offsetof(struct xdp_md, data)), 8679 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8680 offsetof(struct xdp_md, data_end)), 8681 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8682 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8683 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 8684 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8685 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8686 BPF_MOV64_IMM(BPF_REG_0, 0), 8687 BPF_EXIT_INSN(), 8688 }, 8689 .result = ACCEPT, 8690 .prog_type = BPF_PROG_TYPE_XDP, 8691 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8692 }, 8693 { 8694 "XDP pkt read, pkt_data' < pkt_end, bad access 1", 8695 .insns = { 8696 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8697 offsetof(struct xdp_md, data)), 8698 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8699 offsetof(struct xdp_md, data_end)), 8700 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8701 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8702 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 8703 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8704 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8705 BPF_MOV64_IMM(BPF_REG_0, 0), 8706 BPF_EXIT_INSN(), 8707 }, 8708 .errstr = "R1 offset is outside of the packet", 8709 .result = REJECT, 8710 .prog_type = BPF_PROG_TYPE_XDP, 8711 }, 8712 { 8713 "XDP pkt read, pkt_data' < pkt_end, bad access 2", 8714 .insns = { 8715 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8716 offsetof(struct xdp_md, data)), 8717 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8718 offsetof(struct xdp_md, data_end)), 8719 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8720 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8721 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 8722 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8723 BPF_MOV64_IMM(BPF_REG_0, 0), 8724 BPF_EXIT_INSN(), 8725 }, 8726 .errstr = "R1 offset is outside of the packet", 8727 .result = REJECT, 8728 .prog_type = BPF_PROG_TYPE_XDP, 8729 }, 8730 { 8731 "XDP pkt read, pkt_end < pkt_data', good access", 8732 .insns = { 8733 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8734 offsetof(struct xdp_md, data)), 8735 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8736 offsetof(struct xdp_md, data_end)), 8737 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8738 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8739 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 8740 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8741 BPF_MOV64_IMM(BPF_REG_0, 0), 8742 BPF_EXIT_INSN(), 8743 }, 8744 .result = ACCEPT, 8745 .prog_type = BPF_PROG_TYPE_XDP, 8746 }, 8747 { 8748 "XDP pkt read, pkt_end < pkt_data', bad access 1", 8749 .insns = { 8750 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8751 offsetof(struct xdp_md, data)), 8752 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8753 offsetof(struct xdp_md, data_end)), 8754 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8755 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8756 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 8757 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 8758 BPF_MOV64_IMM(BPF_REG_0, 0), 8759 BPF_EXIT_INSN(), 8760 }, 8761 .errstr = "R1 offset is outside of the packet", 8762 .result = REJECT, 8763 .prog_type = BPF_PROG_TYPE_XDP, 8764 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8765 }, 8766 { 8767 "XDP pkt read, pkt_end < pkt_data', bad access 2", 8768 .insns = { 8769 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8770 offsetof(struct xdp_md, data)), 8771 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8772 offsetof(struct xdp_md, data_end)), 8773 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8774 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8775 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 8776 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8777 BPF_MOV64_IMM(BPF_REG_0, 0), 8778 BPF_EXIT_INSN(), 8779 }, 8780 .errstr = "R1 offset is outside of the packet", 8781 .result = REJECT, 8782 .prog_type = BPF_PROG_TYPE_XDP, 8783 }, 8784 { 8785 "XDP pkt read, pkt_data' >= pkt_end, good access", 8786 .insns = { 8787 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8788 offsetof(struct xdp_md, data)), 8789 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8790 offsetof(struct xdp_md, data_end)), 8791 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8792 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8793 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 8794 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8795 BPF_MOV64_IMM(BPF_REG_0, 0), 8796 BPF_EXIT_INSN(), 8797 }, 8798 .result = ACCEPT, 8799 .prog_type = BPF_PROG_TYPE_XDP, 8800 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8801 }, 8802 { 8803 "XDP pkt read, pkt_data' >= pkt_end, bad access 1", 8804 .insns = { 8805 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8806 offsetof(struct xdp_md, data)), 8807 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8808 offsetof(struct xdp_md, data_end)), 8809 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8810 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8811 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 8812 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8813 BPF_MOV64_IMM(BPF_REG_0, 0), 8814 BPF_EXIT_INSN(), 8815 }, 8816 .errstr = "R1 offset is outside of the packet", 8817 .result = REJECT, 8818 .prog_type = BPF_PROG_TYPE_XDP, 8819 }, 8820 { 8821 "XDP pkt read, pkt_data' >= pkt_end, bad access 2", 8822 .insns = { 8823 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8824 offsetof(struct xdp_md, data)), 8825 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8826 offsetof(struct xdp_md, data_end)), 8827 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8828 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8829 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 8830 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8831 BPF_MOV64_IMM(BPF_REG_0, 0), 8832 BPF_EXIT_INSN(), 8833 }, 8834 .errstr = "R1 offset is outside of the packet", 8835 .result = REJECT, 8836 .prog_type = BPF_PROG_TYPE_XDP, 8837 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8838 }, 8839 { 8840 "XDP pkt read, pkt_end >= pkt_data', good access", 8841 .insns = { 8842 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8843 offsetof(struct xdp_md, data)), 8844 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8845 offsetof(struct xdp_md, data_end)), 8846 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8847 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8848 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 8849 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8850 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8851 BPF_MOV64_IMM(BPF_REG_0, 0), 8852 BPF_EXIT_INSN(), 8853 }, 8854 .result = ACCEPT, 8855 .prog_type = BPF_PROG_TYPE_XDP, 8856 }, 8857 { 8858 "XDP pkt read, pkt_end >= pkt_data', bad access 1", 8859 .insns = { 8860 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8861 offsetof(struct xdp_md, data)), 8862 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8863 offsetof(struct xdp_md, data_end)), 8864 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8865 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8866 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 8867 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8868 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 8869 BPF_MOV64_IMM(BPF_REG_0, 0), 8870 BPF_EXIT_INSN(), 8871 }, 8872 .errstr = "R1 offset is outside of the packet", 8873 .result = REJECT, 8874 .prog_type = BPF_PROG_TYPE_XDP, 8875 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8876 }, 8877 { 8878 "XDP pkt read, pkt_end >= pkt_data', bad access 2", 8879 .insns = { 8880 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8881 offsetof(struct xdp_md, data)), 8882 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8883 offsetof(struct xdp_md, data_end)), 8884 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8885 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8886 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 8887 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8888 BPF_MOV64_IMM(BPF_REG_0, 0), 8889 BPF_EXIT_INSN(), 8890 }, 8891 .errstr = "R1 offset is outside of the packet", 8892 .result = REJECT, 8893 .prog_type = BPF_PROG_TYPE_XDP, 8894 }, 8895 { 8896 "XDP pkt read, pkt_data' <= pkt_end, good access", 8897 .insns = { 8898 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8899 offsetof(struct xdp_md, data)), 8900 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8901 offsetof(struct xdp_md, data_end)), 8902 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8903 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8904 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 8905 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8906 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8907 BPF_MOV64_IMM(BPF_REG_0, 0), 8908 BPF_EXIT_INSN(), 8909 }, 8910 .result = ACCEPT, 8911 .prog_type = BPF_PROG_TYPE_XDP, 8912 }, 8913 { 8914 "XDP pkt read, pkt_data' <= pkt_end, bad access 1", 8915 .insns = { 8916 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8917 offsetof(struct xdp_md, data)), 8918 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8919 offsetof(struct xdp_md, data_end)), 8920 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8921 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8922 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 8923 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 8924 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 8925 BPF_MOV64_IMM(BPF_REG_0, 0), 8926 BPF_EXIT_INSN(), 8927 }, 8928 .errstr = "R1 offset is outside of the packet", 8929 .result = REJECT, 8930 .prog_type = BPF_PROG_TYPE_XDP, 8931 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8932 }, 8933 { 8934 "XDP pkt read, pkt_data' <= pkt_end, bad access 2", 8935 .insns = { 8936 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8937 offsetof(struct xdp_md, data)), 8938 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8939 offsetof(struct xdp_md, data_end)), 8940 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8941 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8942 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 8943 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8944 BPF_MOV64_IMM(BPF_REG_0, 0), 8945 BPF_EXIT_INSN(), 8946 }, 8947 .errstr = "R1 offset is outside of the packet", 8948 .result = REJECT, 8949 .prog_type = BPF_PROG_TYPE_XDP, 8950 }, 8951 { 8952 "XDP pkt read, pkt_end <= pkt_data', good access", 8953 .insns = { 8954 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8955 offsetof(struct xdp_md, data)), 8956 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8957 offsetof(struct xdp_md, data_end)), 8958 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8959 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8960 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 8961 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8962 BPF_MOV64_IMM(BPF_REG_0, 0), 8963 BPF_EXIT_INSN(), 8964 }, 8965 .result = ACCEPT, 8966 .prog_type = BPF_PROG_TYPE_XDP, 8967 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 8968 }, 8969 { 8970 "XDP pkt read, pkt_end <= pkt_data', bad access 1", 8971 .insns = { 8972 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8973 offsetof(struct xdp_md, data)), 8974 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8975 offsetof(struct xdp_md, data_end)), 8976 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8977 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8978 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 8979 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 8980 BPF_MOV64_IMM(BPF_REG_0, 0), 8981 BPF_EXIT_INSN(), 8982 }, 8983 .errstr = "R1 offset is outside of the packet", 8984 .result = REJECT, 8985 .prog_type = BPF_PROG_TYPE_XDP, 8986 }, 8987 { 8988 "XDP pkt read, pkt_end <= pkt_data', bad access 2", 8989 .insns = { 8990 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 8991 offsetof(struct xdp_md, data)), 8992 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 8993 offsetof(struct xdp_md, data_end)), 8994 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 8995 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 8996 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 8997 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 8998 BPF_MOV64_IMM(BPF_REG_0, 0), 8999 BPF_EXIT_INSN(), 9000 }, 9001 .errstr = "R1 offset is outside of the packet", 9002 .result = REJECT, 9003 .prog_type = BPF_PROG_TYPE_XDP, 9004 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9005 }, 9006 { 9007 "XDP pkt read, pkt_meta' > pkt_data, good access", 9008 .insns = { 9009 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9010 offsetof(struct xdp_md, data_meta)), 9011 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9012 offsetof(struct xdp_md, data)), 9013 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9014 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9015 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9016 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9017 BPF_MOV64_IMM(BPF_REG_0, 0), 9018 BPF_EXIT_INSN(), 9019 }, 9020 .result = ACCEPT, 9021 .prog_type = BPF_PROG_TYPE_XDP, 9022 }, 9023 { 9024 "XDP pkt read, pkt_meta' > pkt_data, bad access 1", 9025 .insns = { 9026 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9027 offsetof(struct xdp_md, data_meta)), 9028 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9029 offsetof(struct xdp_md, data)), 9030 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9031 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9032 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1), 9033 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9034 BPF_MOV64_IMM(BPF_REG_0, 0), 9035 BPF_EXIT_INSN(), 9036 }, 9037 .errstr = "R1 offset is outside of the packet", 9038 .result = REJECT, 9039 .prog_type = BPF_PROG_TYPE_XDP, 9040 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9041 }, 9042 { 9043 "XDP pkt read, pkt_meta' > pkt_data, bad access 2", 9044 .insns = { 9045 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9046 offsetof(struct xdp_md, data_meta)), 9047 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9048 offsetof(struct xdp_md, data)), 9049 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9050 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9051 BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 0), 9052 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9053 BPF_MOV64_IMM(BPF_REG_0, 0), 9054 BPF_EXIT_INSN(), 9055 }, 9056 .errstr = "R1 offset is outside of the packet", 9057 .result = REJECT, 9058 .prog_type = BPF_PROG_TYPE_XDP, 9059 }, 9060 { 9061 "XDP pkt read, pkt_data > pkt_meta', good access", 9062 .insns = { 9063 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9064 offsetof(struct xdp_md, data_meta)), 9065 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9066 offsetof(struct xdp_md, data)), 9067 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9068 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9069 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9070 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9071 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9072 BPF_MOV64_IMM(BPF_REG_0, 0), 9073 BPF_EXIT_INSN(), 9074 }, 9075 .result = ACCEPT, 9076 .prog_type = BPF_PROG_TYPE_XDP, 9077 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9078 }, 9079 { 9080 "XDP pkt read, pkt_data > pkt_meta', bad access 1", 9081 .insns = { 9082 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9083 offsetof(struct xdp_md, data_meta)), 9084 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9085 offsetof(struct xdp_md, data)), 9086 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9087 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9088 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9089 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9090 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9091 BPF_MOV64_IMM(BPF_REG_0, 0), 9092 BPF_EXIT_INSN(), 9093 }, 9094 .errstr = "R1 offset is outside of the packet", 9095 .result = REJECT, 9096 .prog_type = BPF_PROG_TYPE_XDP, 9097 }, 9098 { 9099 "XDP pkt read, pkt_data > pkt_meta', bad access 2", 9100 .insns = { 9101 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9102 offsetof(struct xdp_md, data_meta)), 9103 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9104 offsetof(struct xdp_md, data)), 9105 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9106 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9107 BPF_JMP_REG(BPF_JGT, BPF_REG_3, BPF_REG_1, 1), 9108 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9109 BPF_MOV64_IMM(BPF_REG_0, 0), 9110 BPF_EXIT_INSN(), 9111 }, 9112 .errstr = "R1 offset is outside of the packet", 9113 .result = REJECT, 9114 .prog_type = BPF_PROG_TYPE_XDP, 9115 }, 9116 { 9117 "XDP pkt read, pkt_meta' < pkt_data, good access", 9118 .insns = { 9119 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9120 offsetof(struct xdp_md, data_meta)), 9121 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9122 offsetof(struct xdp_md, data)), 9123 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9124 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9125 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9126 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9127 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9128 BPF_MOV64_IMM(BPF_REG_0, 0), 9129 BPF_EXIT_INSN(), 9130 }, 9131 .result = ACCEPT, 9132 .prog_type = BPF_PROG_TYPE_XDP, 9133 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9134 }, 9135 { 9136 "XDP pkt read, pkt_meta' < pkt_data, bad access 1", 9137 .insns = { 9138 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9139 offsetof(struct xdp_md, data_meta)), 9140 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9141 offsetof(struct xdp_md, data)), 9142 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9143 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9144 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9145 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9146 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9147 BPF_MOV64_IMM(BPF_REG_0, 0), 9148 BPF_EXIT_INSN(), 9149 }, 9150 .errstr = "R1 offset is outside of the packet", 9151 .result = REJECT, 9152 .prog_type = BPF_PROG_TYPE_XDP, 9153 }, 9154 { 9155 "XDP pkt read, pkt_meta' < pkt_data, bad access 2", 9156 .insns = { 9157 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9158 offsetof(struct xdp_md, data_meta)), 9159 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9160 offsetof(struct xdp_md, data)), 9161 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9162 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9163 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 1), 9164 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9165 BPF_MOV64_IMM(BPF_REG_0, 0), 9166 BPF_EXIT_INSN(), 9167 }, 9168 .errstr = "R1 offset is outside of the packet", 9169 .result = REJECT, 9170 .prog_type = BPF_PROG_TYPE_XDP, 9171 }, 9172 { 9173 "XDP pkt read, pkt_data < pkt_meta', good access", 9174 .insns = { 9175 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9176 offsetof(struct xdp_md, data_meta)), 9177 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9178 offsetof(struct xdp_md, data)), 9179 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9180 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9181 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 9182 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9183 BPF_MOV64_IMM(BPF_REG_0, 0), 9184 BPF_EXIT_INSN(), 9185 }, 9186 .result = ACCEPT, 9187 .prog_type = BPF_PROG_TYPE_XDP, 9188 }, 9189 { 9190 "XDP pkt read, pkt_data < pkt_meta', bad access 1", 9191 .insns = { 9192 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9193 offsetof(struct xdp_md, data_meta)), 9194 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9195 offsetof(struct xdp_md, data)), 9196 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9197 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9198 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 1), 9199 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9200 BPF_MOV64_IMM(BPF_REG_0, 0), 9201 BPF_EXIT_INSN(), 9202 }, 9203 .errstr = "R1 offset is outside of the packet", 9204 .result = REJECT, 9205 .prog_type = BPF_PROG_TYPE_XDP, 9206 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9207 }, 9208 { 9209 "XDP pkt read, pkt_data < pkt_meta', bad access 2", 9210 .insns = { 9211 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9212 offsetof(struct xdp_md, data_meta)), 9213 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9214 offsetof(struct xdp_md, data)), 9215 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9217 BPF_JMP_REG(BPF_JLT, BPF_REG_3, BPF_REG_1, 0), 9218 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9219 BPF_MOV64_IMM(BPF_REG_0, 0), 9220 BPF_EXIT_INSN(), 9221 }, 9222 .errstr = "R1 offset is outside of the packet", 9223 .result = REJECT, 9224 .prog_type = BPF_PROG_TYPE_XDP, 9225 }, 9226 { 9227 "XDP pkt read, pkt_meta' >= pkt_data, good access", 9228 .insns = { 9229 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9230 offsetof(struct xdp_md, data_meta)), 9231 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9232 offsetof(struct xdp_md, data)), 9233 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9234 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9235 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 9236 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9237 BPF_MOV64_IMM(BPF_REG_0, 0), 9238 BPF_EXIT_INSN(), 9239 }, 9240 .result = ACCEPT, 9241 .prog_type = BPF_PROG_TYPE_XDP, 9242 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9243 }, 9244 { 9245 "XDP pkt read, pkt_meta' >= pkt_data, bad access 1", 9246 .insns = { 9247 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9248 offsetof(struct xdp_md, data_meta)), 9249 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9250 offsetof(struct xdp_md, data)), 9251 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9252 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9253 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 1), 9254 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9255 BPF_MOV64_IMM(BPF_REG_0, 0), 9256 BPF_EXIT_INSN(), 9257 }, 9258 .errstr = "R1 offset is outside of the packet", 9259 .result = REJECT, 9260 .prog_type = BPF_PROG_TYPE_XDP, 9261 }, 9262 { 9263 "XDP pkt read, pkt_meta' >= pkt_data, bad access 2", 9264 .insns = { 9265 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9266 offsetof(struct xdp_md, data_meta)), 9267 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9268 offsetof(struct xdp_md, data)), 9269 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9270 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9271 BPF_JMP_REG(BPF_JGE, BPF_REG_1, BPF_REG_3, 0), 9272 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9273 BPF_MOV64_IMM(BPF_REG_0, 0), 9274 BPF_EXIT_INSN(), 9275 }, 9276 .errstr = "R1 offset is outside of the packet", 9277 .result = REJECT, 9278 .prog_type = BPF_PROG_TYPE_XDP, 9279 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9280 }, 9281 { 9282 "XDP pkt read, pkt_data >= pkt_meta', good access", 9283 .insns = { 9284 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9285 offsetof(struct xdp_md, data_meta)), 9286 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9287 offsetof(struct xdp_md, data)), 9288 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9289 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9290 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 9291 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9292 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9293 BPF_MOV64_IMM(BPF_REG_0, 0), 9294 BPF_EXIT_INSN(), 9295 }, 9296 .result = ACCEPT, 9297 .prog_type = BPF_PROG_TYPE_XDP, 9298 }, 9299 { 9300 "XDP pkt read, pkt_data >= pkt_meta', bad access 1", 9301 .insns = { 9302 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9303 offsetof(struct xdp_md, data_meta)), 9304 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9305 offsetof(struct xdp_md, data)), 9306 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9307 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9308 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 9309 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9310 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9311 BPF_MOV64_IMM(BPF_REG_0, 0), 9312 BPF_EXIT_INSN(), 9313 }, 9314 .errstr = "R1 offset is outside of the packet", 9315 .result = REJECT, 9316 .prog_type = BPF_PROG_TYPE_XDP, 9317 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9318 }, 9319 { 9320 "XDP pkt read, pkt_data >= pkt_meta', bad access 2", 9321 .insns = { 9322 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9323 offsetof(struct xdp_md, data_meta)), 9324 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9325 offsetof(struct xdp_md, data)), 9326 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9327 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9328 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 1), 9329 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9330 BPF_MOV64_IMM(BPF_REG_0, 0), 9331 BPF_EXIT_INSN(), 9332 }, 9333 .errstr = "R1 offset is outside of the packet", 9334 .result = REJECT, 9335 .prog_type = BPF_PROG_TYPE_XDP, 9336 }, 9337 { 9338 "XDP pkt read, pkt_meta' <= pkt_data, good access", 9339 .insns = { 9340 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9341 offsetof(struct xdp_md, data_meta)), 9342 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9343 offsetof(struct xdp_md, data)), 9344 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9345 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9346 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 9347 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9348 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9349 BPF_MOV64_IMM(BPF_REG_0, 0), 9350 BPF_EXIT_INSN(), 9351 }, 9352 .result = ACCEPT, 9353 .prog_type = BPF_PROG_TYPE_XDP, 9354 }, 9355 { 9356 "XDP pkt read, pkt_meta' <= pkt_data, bad access 1", 9357 .insns = { 9358 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9359 offsetof(struct xdp_md, data_meta)), 9360 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9361 offsetof(struct xdp_md, data)), 9362 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9363 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9364 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 9365 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9366 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -4), 9367 BPF_MOV64_IMM(BPF_REG_0, 0), 9368 BPF_EXIT_INSN(), 9369 }, 9370 .errstr = "R1 offset is outside of the packet", 9371 .result = REJECT, 9372 .prog_type = BPF_PROG_TYPE_XDP, 9373 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9374 }, 9375 { 9376 "XDP pkt read, pkt_meta' <= pkt_data, bad access 2", 9377 .insns = { 9378 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9379 offsetof(struct xdp_md, data_meta)), 9380 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9381 offsetof(struct xdp_md, data)), 9382 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9383 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9384 BPF_JMP_REG(BPF_JLE, BPF_REG_1, BPF_REG_3, 1), 9385 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9386 BPF_MOV64_IMM(BPF_REG_0, 0), 9387 BPF_EXIT_INSN(), 9388 }, 9389 .errstr = "R1 offset is outside of the packet", 9390 .result = REJECT, 9391 .prog_type = BPF_PROG_TYPE_XDP, 9392 }, 9393 { 9394 "XDP pkt read, pkt_data <= pkt_meta', good access", 9395 .insns = { 9396 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9397 offsetof(struct xdp_md, data_meta)), 9398 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9399 offsetof(struct xdp_md, data)), 9400 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9401 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9402 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 9403 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9404 BPF_MOV64_IMM(BPF_REG_0, 0), 9405 BPF_EXIT_INSN(), 9406 }, 9407 .result = ACCEPT, 9408 .prog_type = BPF_PROG_TYPE_XDP, 9409 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9410 }, 9411 { 9412 "XDP pkt read, pkt_data <= pkt_meta', bad access 1", 9413 .insns = { 9414 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9415 offsetof(struct xdp_md, data_meta)), 9416 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9417 offsetof(struct xdp_md, data)), 9418 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9419 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9420 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 1), 9421 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8), 9422 BPF_MOV64_IMM(BPF_REG_0, 0), 9423 BPF_EXIT_INSN(), 9424 }, 9425 .errstr = "R1 offset is outside of the packet", 9426 .result = REJECT, 9427 .prog_type = BPF_PROG_TYPE_XDP, 9428 }, 9429 { 9430 "XDP pkt read, pkt_data <= pkt_meta', bad access 2", 9431 .insns = { 9432 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 9433 offsetof(struct xdp_md, data_meta)), 9434 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 9435 offsetof(struct xdp_md, data)), 9436 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 9437 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 9438 BPF_JMP_REG(BPF_JLE, BPF_REG_3, BPF_REG_1, 0), 9439 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, -5), 9440 BPF_MOV64_IMM(BPF_REG_0, 0), 9441 BPF_EXIT_INSN(), 9442 }, 9443 .errstr = "R1 offset is outside of the packet", 9444 .result = REJECT, 9445 .prog_type = BPF_PROG_TYPE_XDP, 9446 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 9447 }, 9448 { 9449 "check deducing bounds from const, 1", 9450 .insns = { 9451 BPF_MOV64_IMM(BPF_REG_0, 1), 9452 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 0), 9453 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9454 BPF_EXIT_INSN(), 9455 }, 9456 .result = REJECT, 9457 .errstr = "R0 tried to subtract pointer from scalar", 9458 }, 9459 { 9460 "check deducing bounds from const, 2", 9461 .insns = { 9462 BPF_MOV64_IMM(BPF_REG_0, 1), 9463 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 1, 1), 9464 BPF_EXIT_INSN(), 9465 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 1, 1), 9466 BPF_EXIT_INSN(), 9467 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 9468 BPF_EXIT_INSN(), 9469 }, 9470 .result = ACCEPT, 9471 .retval = 1, 9472 }, 9473 { 9474 "check deducing bounds from const, 3", 9475 .insns = { 9476 BPF_MOV64_IMM(BPF_REG_0, 0), 9477 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 9478 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9479 BPF_EXIT_INSN(), 9480 }, 9481 .result = REJECT, 9482 .errstr = "R0 tried to subtract pointer from scalar", 9483 }, 9484 { 9485 "check deducing bounds from const, 4", 9486 .insns = { 9487 BPF_MOV64_IMM(BPF_REG_0, 0), 9488 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 1), 9489 BPF_EXIT_INSN(), 9490 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 9491 BPF_EXIT_INSN(), 9492 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 9493 BPF_EXIT_INSN(), 9494 }, 9495 .result = ACCEPT, 9496 }, 9497 { 9498 "check deducing bounds from const, 5", 9499 .insns = { 9500 BPF_MOV64_IMM(BPF_REG_0, 0), 9501 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 9502 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9503 BPF_EXIT_INSN(), 9504 }, 9505 .result = REJECT, 9506 .errstr = "R0 tried to subtract pointer from scalar", 9507 }, 9508 { 9509 "check deducing bounds from const, 6", 9510 .insns = { 9511 BPF_MOV64_IMM(BPF_REG_0, 0), 9512 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 9513 BPF_EXIT_INSN(), 9514 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9515 BPF_EXIT_INSN(), 9516 }, 9517 .result = REJECT, 9518 .errstr = "R0 tried to subtract pointer from scalar", 9519 }, 9520 { 9521 "check deducing bounds from const, 7", 9522 .insns = { 9523 BPF_MOV64_IMM(BPF_REG_0, ~0), 9524 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 9525 BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_0), 9526 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9527 offsetof(struct __sk_buff, mark)), 9528 BPF_EXIT_INSN(), 9529 }, 9530 .result = REJECT, 9531 .errstr = "dereference of modified ctx ptr", 9532 }, 9533 { 9534 "check deducing bounds from const, 8", 9535 .insns = { 9536 BPF_MOV64_IMM(BPF_REG_0, ~0), 9537 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 1), 9538 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 9539 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9540 offsetof(struct __sk_buff, mark)), 9541 BPF_EXIT_INSN(), 9542 }, 9543 .result = REJECT, 9544 .errstr = "dereference of modified ctx ptr", 9545 }, 9546 { 9547 "check deducing bounds from const, 9", 9548 .insns = { 9549 BPF_MOV64_IMM(BPF_REG_0, 0), 9550 BPF_JMP_IMM(BPF_JSGE, BPF_REG_0, 0, 0), 9551 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9552 BPF_EXIT_INSN(), 9553 }, 9554 .result = REJECT, 9555 .errstr = "R0 tried to subtract pointer from scalar", 9556 }, 9557 { 9558 "check deducing bounds from const, 10", 9559 .insns = { 9560 BPF_MOV64_IMM(BPF_REG_0, 0), 9561 BPF_JMP_IMM(BPF_JSLE, BPF_REG_0, 0, 0), 9562 /* Marks reg as unknown. */ 9563 BPF_ALU64_IMM(BPF_NEG, BPF_REG_0, 0), 9564 BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), 9565 BPF_EXIT_INSN(), 9566 }, 9567 .result = REJECT, 9568 .errstr = "math between ctx pointer and register with unbounded min value is not allowed", 9569 }, 9570 { 9571 "bpf_exit with invalid return code. test1", 9572 .insns = { 9573 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 9574 BPF_EXIT_INSN(), 9575 }, 9576 .errstr = "R0 has value (0x0; 0xffffffff)", 9577 .result = REJECT, 9578 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9579 }, 9580 { 9581 "bpf_exit with invalid return code. test2", 9582 .insns = { 9583 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 9584 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 9585 BPF_EXIT_INSN(), 9586 }, 9587 .result = ACCEPT, 9588 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9589 }, 9590 { 9591 "bpf_exit with invalid return code. test3", 9592 .insns = { 9593 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 9594 BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 3), 9595 BPF_EXIT_INSN(), 9596 }, 9597 .errstr = "R0 has value (0x0; 0x3)", 9598 .result = REJECT, 9599 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9600 }, 9601 { 9602 "bpf_exit with invalid return code. test4", 9603 .insns = { 9604 BPF_MOV64_IMM(BPF_REG_0, 1), 9605 BPF_EXIT_INSN(), 9606 }, 9607 .result = ACCEPT, 9608 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9609 }, 9610 { 9611 "bpf_exit with invalid return code. test5", 9612 .insns = { 9613 BPF_MOV64_IMM(BPF_REG_0, 2), 9614 BPF_EXIT_INSN(), 9615 }, 9616 .errstr = "R0 has value (0x2; 0x0)", 9617 .result = REJECT, 9618 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9619 }, 9620 { 9621 "bpf_exit with invalid return code. test6", 9622 .insns = { 9623 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 9624 BPF_EXIT_INSN(), 9625 }, 9626 .errstr = "R0 is not a known value (ctx)", 9627 .result = REJECT, 9628 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9629 }, 9630 { 9631 "bpf_exit with invalid return code. test7", 9632 .insns = { 9633 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 9634 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 4), 9635 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_2), 9636 BPF_EXIT_INSN(), 9637 }, 9638 .errstr = "R0 has unknown scalar value", 9639 .result = REJECT, 9640 .prog_type = BPF_PROG_TYPE_CGROUP_SOCK, 9641 }, 9642 { 9643 "calls: basic sanity", 9644 .insns = { 9645 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 9646 BPF_MOV64_IMM(BPF_REG_0, 1), 9647 BPF_EXIT_INSN(), 9648 BPF_MOV64_IMM(BPF_REG_0, 2), 9649 BPF_EXIT_INSN(), 9650 }, 9651 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9652 .result = ACCEPT, 9653 }, 9654 { 9655 "calls: not on unpriviledged", 9656 .insns = { 9657 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 9658 BPF_MOV64_IMM(BPF_REG_0, 1), 9659 BPF_EXIT_INSN(), 9660 BPF_MOV64_IMM(BPF_REG_0, 2), 9661 BPF_EXIT_INSN(), 9662 }, 9663 .errstr_unpriv = "function calls to other bpf functions are allowed for root only", 9664 .result_unpriv = REJECT, 9665 .result = ACCEPT, 9666 .retval = 1, 9667 }, 9668 { 9669 "calls: div by 0 in subprog", 9670 .insns = { 9671 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9672 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 9673 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 9674 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 9675 offsetof(struct __sk_buff, data_end)), 9676 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 9677 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 9678 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 9679 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9680 BPF_MOV64_IMM(BPF_REG_0, 1), 9681 BPF_EXIT_INSN(), 9682 BPF_MOV32_IMM(BPF_REG_2, 0), 9683 BPF_MOV32_IMM(BPF_REG_3, 1), 9684 BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2), 9685 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9686 offsetof(struct __sk_buff, data)), 9687 BPF_EXIT_INSN(), 9688 }, 9689 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9690 .result = ACCEPT, 9691 .retval = 1, 9692 }, 9693 { 9694 "calls: multiple ret types in subprog 1", 9695 .insns = { 9696 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9697 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 9698 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 9699 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 9700 offsetof(struct __sk_buff, data_end)), 9701 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 9702 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 9703 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 9704 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9705 BPF_MOV64_IMM(BPF_REG_0, 1), 9706 BPF_EXIT_INSN(), 9707 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9708 offsetof(struct __sk_buff, data)), 9709 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9710 BPF_MOV32_IMM(BPF_REG_0, 42), 9711 BPF_EXIT_INSN(), 9712 }, 9713 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9714 .result = REJECT, 9715 .errstr = "R0 invalid mem access 'inv'", 9716 }, 9717 { 9718 "calls: multiple ret types in subprog 2", 9719 .insns = { 9720 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9721 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 9722 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 9723 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 9724 offsetof(struct __sk_buff, data_end)), 9725 BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 9726 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 9727 BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 9728 BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 9729 BPF_MOV64_IMM(BPF_REG_0, 1), 9730 BPF_EXIT_INSN(), 9731 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9732 offsetof(struct __sk_buff, data)), 9733 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9734 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9), 9735 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9736 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 9737 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 9738 BPF_LD_MAP_FD(BPF_REG_1, 0), 9739 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 9740 BPF_FUNC_map_lookup_elem), 9741 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 9742 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 9743 offsetof(struct __sk_buff, data)), 9744 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 9745 BPF_EXIT_INSN(), 9746 }, 9747 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 9748 .fixup_map1 = { 16 }, 9749 .result = REJECT, 9750 .errstr = "R0 min value is outside of the array range", 9751 }, 9752 { 9753 "calls: overlapping caller/callee", 9754 .insns = { 9755 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0), 9756 BPF_MOV64_IMM(BPF_REG_0, 1), 9757 BPF_EXIT_INSN(), 9758 }, 9759 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9760 .errstr = "last insn is not an exit or jmp", 9761 .result = REJECT, 9762 }, 9763 { 9764 "calls: wrong recursive calls", 9765 .insns = { 9766 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 9767 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 9768 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 9769 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 9770 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 9771 BPF_MOV64_IMM(BPF_REG_0, 1), 9772 BPF_EXIT_INSN(), 9773 }, 9774 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9775 .errstr = "jump out of range", 9776 .result = REJECT, 9777 }, 9778 { 9779 "calls: wrong src reg", 9780 .insns = { 9781 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0), 9782 BPF_MOV64_IMM(BPF_REG_0, 1), 9783 BPF_EXIT_INSN(), 9784 }, 9785 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9786 .errstr = "BPF_CALL uses reserved fields", 9787 .result = REJECT, 9788 }, 9789 { 9790 "calls: wrong off value", 9791 .insns = { 9792 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2), 9793 BPF_MOV64_IMM(BPF_REG_0, 1), 9794 BPF_EXIT_INSN(), 9795 BPF_MOV64_IMM(BPF_REG_0, 2), 9796 BPF_EXIT_INSN(), 9797 }, 9798 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9799 .errstr = "BPF_CALL uses reserved fields", 9800 .result = REJECT, 9801 }, 9802 { 9803 "calls: jump back loop", 9804 .insns = { 9805 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 9806 BPF_MOV64_IMM(BPF_REG_0, 1), 9807 BPF_EXIT_INSN(), 9808 }, 9809 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9810 .errstr = "back-edge from insn 0 to 0", 9811 .result = REJECT, 9812 }, 9813 { 9814 "calls: conditional call", 9815 .insns = { 9816 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9817 offsetof(struct __sk_buff, mark)), 9818 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 9819 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 9820 BPF_MOV64_IMM(BPF_REG_0, 1), 9821 BPF_EXIT_INSN(), 9822 BPF_MOV64_IMM(BPF_REG_0, 2), 9823 BPF_EXIT_INSN(), 9824 }, 9825 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9826 .errstr = "jump out of range", 9827 .result = REJECT, 9828 }, 9829 { 9830 "calls: conditional call 2", 9831 .insns = { 9832 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9833 offsetof(struct __sk_buff, mark)), 9834 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 9835 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 9836 BPF_MOV64_IMM(BPF_REG_0, 1), 9837 BPF_EXIT_INSN(), 9838 BPF_MOV64_IMM(BPF_REG_0, 2), 9839 BPF_EXIT_INSN(), 9840 BPF_MOV64_IMM(BPF_REG_0, 3), 9841 BPF_EXIT_INSN(), 9842 }, 9843 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9844 .result = ACCEPT, 9845 }, 9846 { 9847 "calls: conditional call 3", 9848 .insns = { 9849 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9850 offsetof(struct __sk_buff, mark)), 9851 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 9852 BPF_JMP_IMM(BPF_JA, 0, 0, 4), 9853 BPF_MOV64_IMM(BPF_REG_0, 1), 9854 BPF_EXIT_INSN(), 9855 BPF_MOV64_IMM(BPF_REG_0, 1), 9856 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 9857 BPF_MOV64_IMM(BPF_REG_0, 3), 9858 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 9859 }, 9860 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9861 .errstr = "back-edge from insn", 9862 .result = REJECT, 9863 }, 9864 { 9865 "calls: conditional call 4", 9866 .insns = { 9867 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9868 offsetof(struct __sk_buff, mark)), 9869 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 9870 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 9871 BPF_MOV64_IMM(BPF_REG_0, 1), 9872 BPF_EXIT_INSN(), 9873 BPF_MOV64_IMM(BPF_REG_0, 1), 9874 BPF_JMP_IMM(BPF_JA, 0, 0, -5), 9875 BPF_MOV64_IMM(BPF_REG_0, 3), 9876 BPF_EXIT_INSN(), 9877 }, 9878 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9879 .result = ACCEPT, 9880 }, 9881 { 9882 "calls: conditional call 5", 9883 .insns = { 9884 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9885 offsetof(struct __sk_buff, mark)), 9886 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 9887 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 9888 BPF_MOV64_IMM(BPF_REG_0, 1), 9889 BPF_EXIT_INSN(), 9890 BPF_MOV64_IMM(BPF_REG_0, 1), 9891 BPF_JMP_IMM(BPF_JA, 0, 0, -6), 9892 BPF_MOV64_IMM(BPF_REG_0, 3), 9893 BPF_EXIT_INSN(), 9894 }, 9895 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9896 .errstr = "back-edge from insn", 9897 .result = REJECT, 9898 }, 9899 { 9900 "calls: conditional call 6", 9901 .insns = { 9902 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 9903 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -2), 9904 BPF_EXIT_INSN(), 9905 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9906 offsetof(struct __sk_buff, mark)), 9907 BPF_EXIT_INSN(), 9908 }, 9909 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9910 .errstr = "back-edge from insn", 9911 .result = REJECT, 9912 }, 9913 { 9914 "calls: using r0 returned by callee", 9915 .insns = { 9916 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9917 BPF_EXIT_INSN(), 9918 BPF_MOV64_IMM(BPF_REG_0, 2), 9919 BPF_EXIT_INSN(), 9920 }, 9921 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9922 .result = ACCEPT, 9923 }, 9924 { 9925 "calls: using uninit r0 from callee", 9926 .insns = { 9927 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9928 BPF_EXIT_INSN(), 9929 BPF_EXIT_INSN(), 9930 }, 9931 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9932 .errstr = "!read_ok", 9933 .result = REJECT, 9934 }, 9935 { 9936 "calls: callee is using r1", 9937 .insns = { 9938 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9939 BPF_EXIT_INSN(), 9940 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 9941 offsetof(struct __sk_buff, len)), 9942 BPF_EXIT_INSN(), 9943 }, 9944 .prog_type = BPF_PROG_TYPE_SCHED_ACT, 9945 .result = ACCEPT, 9946 .retval = TEST_DATA_LEN, 9947 }, 9948 { 9949 "calls: callee using args1", 9950 .insns = { 9951 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9952 BPF_EXIT_INSN(), 9953 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 9954 BPF_EXIT_INSN(), 9955 }, 9956 .errstr_unpriv = "allowed for root only", 9957 .result_unpriv = REJECT, 9958 .result = ACCEPT, 9959 .retval = POINTER_VALUE, 9960 }, 9961 { 9962 "calls: callee using wrong args2", 9963 .insns = { 9964 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9965 BPF_EXIT_INSN(), 9966 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 9967 BPF_EXIT_INSN(), 9968 }, 9969 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 9970 .errstr = "R2 !read_ok", 9971 .result = REJECT, 9972 }, 9973 { 9974 "calls: callee using two args", 9975 .insns = { 9976 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9977 BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 9978 offsetof(struct __sk_buff, len)), 9979 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6, 9980 offsetof(struct __sk_buff, len)), 9981 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9982 BPF_EXIT_INSN(), 9983 BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 9984 BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 9985 BPF_EXIT_INSN(), 9986 }, 9987 .errstr_unpriv = "allowed for root only", 9988 .result_unpriv = REJECT, 9989 .result = ACCEPT, 9990 .retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN, 9991 }, 9992 { 9993 "calls: callee changing pkt pointers", 9994 .insns = { 9995 BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 9996 offsetof(struct xdp_md, data)), 9997 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 9998 offsetof(struct xdp_md, data_end)), 9999 BPF_MOV64_REG(BPF_REG_8, BPF_REG_6), 10000 BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8), 10001 BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2), 10002 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10003 /* clear_all_pkt_pointers() has to walk all frames 10004 * to make sure that pkt pointers in the caller 10005 * are cleared when callee is calling a helper that 10006 * adjusts packet size 10007 */ 10008 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 10009 BPF_MOV32_IMM(BPF_REG_0, 0), 10010 BPF_EXIT_INSN(), 10011 BPF_MOV64_IMM(BPF_REG_2, 0), 10012 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10013 BPF_FUNC_xdp_adjust_head), 10014 BPF_EXIT_INSN(), 10015 }, 10016 .result = REJECT, 10017 .errstr = "R6 invalid mem access 'inv'", 10018 .prog_type = BPF_PROG_TYPE_XDP, 10019 }, 10020 { 10021 "calls: two calls with args", 10022 .insns = { 10023 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10024 BPF_EXIT_INSN(), 10025 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10026 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 10027 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 10028 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10029 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10030 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 10031 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 10032 BPF_EXIT_INSN(), 10033 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10034 offsetof(struct __sk_buff, len)), 10035 BPF_EXIT_INSN(), 10036 }, 10037 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10038 .result = ACCEPT, 10039 .retval = TEST_DATA_LEN + TEST_DATA_LEN, 10040 }, 10041 { 10042 "calls: calls with stack arith", 10043 .insns = { 10044 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10045 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 10046 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10047 BPF_EXIT_INSN(), 10048 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 10049 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10050 BPF_EXIT_INSN(), 10051 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 10052 BPF_MOV64_IMM(BPF_REG_0, 42), 10053 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 10054 BPF_EXIT_INSN(), 10055 }, 10056 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10057 .result = ACCEPT, 10058 .retval = 42, 10059 }, 10060 { 10061 "calls: calls with misaligned stack access", 10062 .insns = { 10063 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10064 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 10065 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10066 BPF_EXIT_INSN(), 10067 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61), 10068 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10069 BPF_EXIT_INSN(), 10070 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 10071 BPF_MOV64_IMM(BPF_REG_0, 42), 10072 BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 10073 BPF_EXIT_INSN(), 10074 }, 10075 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10076 .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 10077 .errstr = "misaligned stack access", 10078 .result = REJECT, 10079 }, 10080 { 10081 "calls: calls control flow, jump test", 10082 .insns = { 10083 BPF_MOV64_IMM(BPF_REG_0, 42), 10084 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10085 BPF_MOV64_IMM(BPF_REG_0, 43), 10086 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10087 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 10088 BPF_EXIT_INSN(), 10089 }, 10090 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10091 .result = ACCEPT, 10092 .retval = 43, 10093 }, 10094 { 10095 "calls: calls control flow, jump test 2", 10096 .insns = { 10097 BPF_MOV64_IMM(BPF_REG_0, 42), 10098 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10099 BPF_MOV64_IMM(BPF_REG_0, 43), 10100 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 10101 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 10102 BPF_EXIT_INSN(), 10103 }, 10104 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10105 .errstr = "jump out of range from insn 1 to 4", 10106 .result = REJECT, 10107 }, 10108 { 10109 "calls: two calls with bad jump", 10110 .insns = { 10111 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10112 BPF_EXIT_INSN(), 10113 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10114 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 10115 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 10116 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10117 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10118 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 10119 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 10120 BPF_EXIT_INSN(), 10121 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10122 offsetof(struct __sk_buff, len)), 10123 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 10124 BPF_EXIT_INSN(), 10125 }, 10126 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10127 .errstr = "jump out of range from insn 11 to 9", 10128 .result = REJECT, 10129 }, 10130 { 10131 "calls: recursive call. test1", 10132 .insns = { 10133 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10134 BPF_EXIT_INSN(), 10135 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 10136 BPF_EXIT_INSN(), 10137 }, 10138 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10139 .errstr = "back-edge", 10140 .result = REJECT, 10141 }, 10142 { 10143 "calls: recursive call. test2", 10144 .insns = { 10145 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10146 BPF_EXIT_INSN(), 10147 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 10148 BPF_EXIT_INSN(), 10149 }, 10150 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10151 .errstr = "back-edge", 10152 .result = REJECT, 10153 }, 10154 { 10155 "calls: unreachable code", 10156 .insns = { 10157 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10158 BPF_EXIT_INSN(), 10159 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10160 BPF_EXIT_INSN(), 10161 BPF_MOV64_IMM(BPF_REG_0, 0), 10162 BPF_EXIT_INSN(), 10163 BPF_MOV64_IMM(BPF_REG_0, 0), 10164 BPF_EXIT_INSN(), 10165 }, 10166 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10167 .errstr = "unreachable insn 6", 10168 .result = REJECT, 10169 }, 10170 { 10171 "calls: invalid call", 10172 .insns = { 10173 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10174 BPF_EXIT_INSN(), 10175 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4), 10176 BPF_EXIT_INSN(), 10177 }, 10178 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10179 .errstr = "invalid destination", 10180 .result = REJECT, 10181 }, 10182 { 10183 "calls: invalid call 2", 10184 .insns = { 10185 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10186 BPF_EXIT_INSN(), 10187 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff), 10188 BPF_EXIT_INSN(), 10189 }, 10190 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10191 .errstr = "invalid destination", 10192 .result = REJECT, 10193 }, 10194 { 10195 "calls: jumping across function bodies. test1", 10196 .insns = { 10197 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10198 BPF_MOV64_IMM(BPF_REG_0, 0), 10199 BPF_EXIT_INSN(), 10200 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 10201 BPF_EXIT_INSN(), 10202 }, 10203 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10204 .errstr = "jump out of range", 10205 .result = REJECT, 10206 }, 10207 { 10208 "calls: jumping across function bodies. test2", 10209 .insns = { 10210 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 10211 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10212 BPF_MOV64_IMM(BPF_REG_0, 0), 10213 BPF_EXIT_INSN(), 10214 BPF_EXIT_INSN(), 10215 }, 10216 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10217 .errstr = "jump out of range", 10218 .result = REJECT, 10219 }, 10220 { 10221 "calls: call without exit", 10222 .insns = { 10223 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10224 BPF_EXIT_INSN(), 10225 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10226 BPF_EXIT_INSN(), 10227 BPF_MOV64_IMM(BPF_REG_0, 0), 10228 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2), 10229 }, 10230 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10231 .errstr = "not an exit", 10232 .result = REJECT, 10233 }, 10234 { 10235 "calls: call into middle of ld_imm64", 10236 .insns = { 10237 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10238 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10239 BPF_MOV64_IMM(BPF_REG_0, 0), 10240 BPF_EXIT_INSN(), 10241 BPF_LD_IMM64(BPF_REG_0, 0), 10242 BPF_EXIT_INSN(), 10243 }, 10244 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10245 .errstr = "last insn", 10246 .result = REJECT, 10247 }, 10248 { 10249 "calls: call into middle of other call", 10250 .insns = { 10251 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10252 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10253 BPF_MOV64_IMM(BPF_REG_0, 0), 10254 BPF_EXIT_INSN(), 10255 BPF_MOV64_IMM(BPF_REG_0, 0), 10256 BPF_MOV64_IMM(BPF_REG_0, 0), 10257 BPF_EXIT_INSN(), 10258 }, 10259 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10260 .errstr = "last insn", 10261 .result = REJECT, 10262 }, 10263 { 10264 "calls: ld_abs with changing ctx data in callee", 10265 .insns = { 10266 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10267 BPF_LD_ABS(BPF_B, 0), 10268 BPF_LD_ABS(BPF_H, 0), 10269 BPF_LD_ABS(BPF_W, 0), 10270 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 10271 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 10272 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 10273 BPF_LD_ABS(BPF_B, 0), 10274 BPF_LD_ABS(BPF_H, 0), 10275 BPF_LD_ABS(BPF_W, 0), 10276 BPF_EXIT_INSN(), 10277 BPF_MOV64_IMM(BPF_REG_2, 1), 10278 BPF_MOV64_IMM(BPF_REG_3, 2), 10279 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10280 BPF_FUNC_skb_vlan_push), 10281 BPF_EXIT_INSN(), 10282 }, 10283 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10284 .errstr = "BPF_LD_[ABS|IND] instructions cannot be mixed", 10285 .result = REJECT, 10286 }, 10287 { 10288 "calls: two calls with bad fallthrough", 10289 .insns = { 10290 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10291 BPF_EXIT_INSN(), 10292 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10293 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 10294 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 10295 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10296 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10297 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 10298 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 10299 BPF_MOV64_REG(BPF_REG_0, BPF_REG_0), 10300 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 10301 offsetof(struct __sk_buff, len)), 10302 BPF_EXIT_INSN(), 10303 }, 10304 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 10305 .errstr = "not an exit", 10306 .result = REJECT, 10307 }, 10308 { 10309 "calls: two calls with stack read", 10310 .insns = { 10311 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10312 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10313 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10314 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10315 BPF_EXIT_INSN(), 10316 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10317 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 10318 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 10319 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10320 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10321 BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 10322 BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 10323 BPF_EXIT_INSN(), 10324 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10325 BPF_EXIT_INSN(), 10326 }, 10327 .prog_type = BPF_PROG_TYPE_XDP, 10328 .result = ACCEPT, 10329 }, 10330 { 10331 "calls: two calls with stack write", 10332 .insns = { 10333 /* main prog */ 10334 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10335 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10336 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10337 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10339 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10340 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 10341 BPF_EXIT_INSN(), 10342 10343 /* subprog 1 */ 10344 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10345 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10346 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7), 10347 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 10348 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10349 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 10350 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 10351 BPF_MOV64_REG(BPF_REG_0, BPF_REG_8), 10352 /* write into stack frame of main prog */ 10353 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10354 BPF_EXIT_INSN(), 10355 10356 /* subprog 2 */ 10357 /* read from stack frame of main prog */ 10358 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 10359 BPF_EXIT_INSN(), 10360 }, 10361 .prog_type = BPF_PROG_TYPE_XDP, 10362 .result = ACCEPT, 10363 }, 10364 { 10365 "calls: stack overflow using two frames (pre-call access)", 10366 .insns = { 10367 /* prog 1 */ 10368 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10369 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), 10370 BPF_EXIT_INSN(), 10371 10372 /* prog 2 */ 10373 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10374 BPF_MOV64_IMM(BPF_REG_0, 0), 10375 BPF_EXIT_INSN(), 10376 }, 10377 .prog_type = BPF_PROG_TYPE_XDP, 10378 .errstr = "combined stack size", 10379 .result = REJECT, 10380 }, 10381 { 10382 "calls: stack overflow using two frames (post-call access)", 10383 .insns = { 10384 /* prog 1 */ 10385 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), 10386 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10387 BPF_EXIT_INSN(), 10388 10389 /* prog 2 */ 10390 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10391 BPF_MOV64_IMM(BPF_REG_0, 0), 10392 BPF_EXIT_INSN(), 10393 }, 10394 .prog_type = BPF_PROG_TYPE_XDP, 10395 .errstr = "combined stack size", 10396 .result = REJECT, 10397 }, 10398 { 10399 "calls: stack depth check using three frames. test1", 10400 .insns = { 10401 /* main */ 10402 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 10403 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 10404 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 10405 BPF_MOV64_IMM(BPF_REG_0, 0), 10406 BPF_EXIT_INSN(), 10407 /* A */ 10408 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 10409 BPF_EXIT_INSN(), 10410 /* B */ 10411 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 10412 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 10413 BPF_EXIT_INSN(), 10414 }, 10415 .prog_type = BPF_PROG_TYPE_XDP, 10416 /* stack_main=32, stack_A=256, stack_B=64 10417 * and max(main+A, main+A+B) < 512 10418 */ 10419 .result = ACCEPT, 10420 }, 10421 { 10422 "calls: stack depth check using three frames. test2", 10423 .insns = { 10424 /* main */ 10425 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 10426 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 10427 BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 10428 BPF_MOV64_IMM(BPF_REG_0, 0), 10429 BPF_EXIT_INSN(), 10430 /* A */ 10431 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 10432 BPF_EXIT_INSN(), 10433 /* B */ 10434 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 10435 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 10436 BPF_EXIT_INSN(), 10437 }, 10438 .prog_type = BPF_PROG_TYPE_XDP, 10439 /* stack_main=32, stack_A=64, stack_B=256 10440 * and max(main+A, main+A+B) < 512 10441 */ 10442 .result = ACCEPT, 10443 }, 10444 { 10445 "calls: stack depth check using three frames. test3", 10446 .insns = { 10447 /* main */ 10448 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10449 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 10450 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10451 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */ 10452 BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1), 10453 BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 10454 BPF_MOV64_IMM(BPF_REG_0, 0), 10455 BPF_EXIT_INSN(), 10456 /* A */ 10457 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1), 10458 BPF_EXIT_INSN(), 10459 BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0), 10460 BPF_JMP_IMM(BPF_JA, 0, 0, -3), 10461 /* B */ 10462 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1), 10463 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */ 10464 BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 10465 BPF_EXIT_INSN(), 10466 }, 10467 .prog_type = BPF_PROG_TYPE_XDP, 10468 /* stack_main=64, stack_A=224, stack_B=256 10469 * and max(main+A, main+A+B) > 512 10470 */ 10471 .errstr = "combined stack", 10472 .result = REJECT, 10473 }, 10474 { 10475 "calls: stack depth check using three frames. test4", 10476 /* void main(void) { 10477 * func1(0); 10478 * func1(1); 10479 * func2(1); 10480 * } 10481 * void func1(int alloc_or_recurse) { 10482 * if (alloc_or_recurse) { 10483 * frame_pointer[-300] = 1; 10484 * } else { 10485 * func2(alloc_or_recurse); 10486 * } 10487 * } 10488 * void func2(int alloc_or_recurse) { 10489 * if (alloc_or_recurse) { 10490 * frame_pointer[-300] = 1; 10491 * } 10492 * } 10493 */ 10494 .insns = { 10495 /* main */ 10496 BPF_MOV64_IMM(BPF_REG_1, 0), 10497 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 10498 BPF_MOV64_IMM(BPF_REG_1, 1), 10499 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 10500 BPF_MOV64_IMM(BPF_REG_1, 1), 10501 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */ 10502 BPF_MOV64_IMM(BPF_REG_0, 0), 10503 BPF_EXIT_INSN(), 10504 /* A */ 10505 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 10506 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10507 BPF_EXIT_INSN(), 10508 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 10509 BPF_EXIT_INSN(), 10510 /* B */ 10511 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 10512 BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 10513 BPF_EXIT_INSN(), 10514 }, 10515 .prog_type = BPF_PROG_TYPE_XDP, 10516 .result = REJECT, 10517 .errstr = "combined stack", 10518 }, 10519 { 10520 "calls: stack depth check using three frames. test5", 10521 .insns = { 10522 /* main */ 10523 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 10524 BPF_EXIT_INSN(), 10525 /* A */ 10526 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 10527 BPF_EXIT_INSN(), 10528 /* B */ 10529 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 10530 BPF_EXIT_INSN(), 10531 /* C */ 10532 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 10533 BPF_EXIT_INSN(), 10534 /* D */ 10535 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 10536 BPF_EXIT_INSN(), 10537 /* E */ 10538 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 10539 BPF_EXIT_INSN(), 10540 /* F */ 10541 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 10542 BPF_EXIT_INSN(), 10543 /* G */ 10544 BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 10545 BPF_EXIT_INSN(), 10546 /* H */ 10547 BPF_MOV64_IMM(BPF_REG_0, 0), 10548 BPF_EXIT_INSN(), 10549 }, 10550 .prog_type = BPF_PROG_TYPE_XDP, 10551 .errstr = "call stack", 10552 .result = REJECT, 10553 }, 10554 { 10555 "calls: spill into caller stack frame", 10556 .insns = { 10557 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10558 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10559 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10560 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10561 BPF_EXIT_INSN(), 10562 BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 10563 BPF_MOV64_IMM(BPF_REG_0, 0), 10564 BPF_EXIT_INSN(), 10565 }, 10566 .prog_type = BPF_PROG_TYPE_XDP, 10567 .errstr = "cannot spill", 10568 .result = REJECT, 10569 }, 10570 { 10571 "calls: write into caller stack frame", 10572 .insns = { 10573 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10574 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10575 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10576 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10577 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 10578 BPF_EXIT_INSN(), 10579 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), 10580 BPF_MOV64_IMM(BPF_REG_0, 0), 10581 BPF_EXIT_INSN(), 10582 }, 10583 .prog_type = BPF_PROG_TYPE_XDP, 10584 .result = ACCEPT, 10585 .retval = 42, 10586 }, 10587 { 10588 "calls: write into callee stack frame", 10589 .insns = { 10590 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10591 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 10592 BPF_EXIT_INSN(), 10593 BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10594 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8), 10595 BPF_EXIT_INSN(), 10596 }, 10597 .prog_type = BPF_PROG_TYPE_XDP, 10598 .errstr = "cannot return stack pointer", 10599 .result = REJECT, 10600 }, 10601 { 10602 "calls: two calls with stack write and void return", 10603 .insns = { 10604 /* main prog */ 10605 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10606 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10607 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10608 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10609 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10610 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10611 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 10612 BPF_EXIT_INSN(), 10613 10614 /* subprog 1 */ 10615 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10616 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10617 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10618 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10619 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10620 BPF_EXIT_INSN(), 10621 10622 /* subprog 2 */ 10623 /* write into stack frame of main prog */ 10624 BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0), 10625 BPF_EXIT_INSN(), /* void return */ 10626 }, 10627 .prog_type = BPF_PROG_TYPE_XDP, 10628 .result = ACCEPT, 10629 }, 10630 { 10631 "calls: ambiguous return value", 10632 .insns = { 10633 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10634 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 10635 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 10636 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10637 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10638 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 10639 BPF_EXIT_INSN(), 10640 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 10641 BPF_MOV64_IMM(BPF_REG_0, 0), 10642 BPF_EXIT_INSN(), 10643 }, 10644 .errstr_unpriv = "allowed for root only", 10645 .result_unpriv = REJECT, 10646 .errstr = "R0 !read_ok", 10647 .result = REJECT, 10648 }, 10649 { 10650 "calls: two calls that return map_value", 10651 .insns = { 10652 /* main prog */ 10653 /* pass fp-16, fp-8 into a function */ 10654 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10655 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10656 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10657 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10658 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 10659 10660 /* fetch map_value_ptr from the stack of this function */ 10661 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 10662 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 10663 /* write into map value */ 10664 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10665 /* fetch secound map_value_ptr from the stack */ 10666 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 10667 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 10668 /* write into map value */ 10669 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10670 BPF_MOV64_IMM(BPF_REG_0, 0), 10671 BPF_EXIT_INSN(), 10672 10673 /* subprog 1 */ 10674 /* call 3rd function twice */ 10675 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10676 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10677 /* first time with fp-8 */ 10678 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10679 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10680 /* second time with fp-16 */ 10681 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10682 BPF_EXIT_INSN(), 10683 10684 /* subprog 2 */ 10685 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10686 /* lookup from map */ 10687 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10688 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10689 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10690 BPF_LD_MAP_FD(BPF_REG_1, 0), 10691 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10692 BPF_FUNC_map_lookup_elem), 10693 /* write map_value_ptr into stack frame of main prog */ 10694 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10695 BPF_MOV64_IMM(BPF_REG_0, 0), 10696 BPF_EXIT_INSN(), /* return 0 */ 10697 }, 10698 .prog_type = BPF_PROG_TYPE_XDP, 10699 .fixup_map1 = { 23 }, 10700 .result = ACCEPT, 10701 }, 10702 { 10703 "calls: two calls that return map_value with bool condition", 10704 .insns = { 10705 /* main prog */ 10706 /* pass fp-16, fp-8 into a function */ 10707 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10708 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10709 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10710 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10711 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10712 BPF_MOV64_IMM(BPF_REG_0, 0), 10713 BPF_EXIT_INSN(), 10714 10715 /* subprog 1 */ 10716 /* call 3rd function twice */ 10717 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10718 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10719 /* first time with fp-8 */ 10720 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 10721 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 10722 /* fetch map_value_ptr from the stack of this function */ 10723 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 10724 /* write into map value */ 10725 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10726 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10727 /* second time with fp-16 */ 10728 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 10729 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 10730 /* fetch secound map_value_ptr from the stack */ 10731 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 10732 /* write into map value */ 10733 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10734 BPF_EXIT_INSN(), 10735 10736 /* subprog 2 */ 10737 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10738 /* lookup from map */ 10739 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10740 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10741 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10742 BPF_LD_MAP_FD(BPF_REG_1, 0), 10743 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10744 BPF_FUNC_map_lookup_elem), 10745 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10746 BPF_MOV64_IMM(BPF_REG_0, 0), 10747 BPF_EXIT_INSN(), /* return 0 */ 10748 /* write map_value_ptr into stack frame of main prog */ 10749 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10750 BPF_MOV64_IMM(BPF_REG_0, 1), 10751 BPF_EXIT_INSN(), /* return 1 */ 10752 }, 10753 .prog_type = BPF_PROG_TYPE_XDP, 10754 .fixup_map1 = { 23 }, 10755 .result = ACCEPT, 10756 }, 10757 { 10758 "calls: two calls that return map_value with incorrect bool check", 10759 .insns = { 10760 /* main prog */ 10761 /* pass fp-16, fp-8 into a function */ 10762 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10763 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10764 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10765 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10766 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10767 BPF_MOV64_IMM(BPF_REG_0, 0), 10768 BPF_EXIT_INSN(), 10769 10770 /* subprog 1 */ 10771 /* call 3rd function twice */ 10772 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10773 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10774 /* first time with fp-8 */ 10775 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 10776 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 10777 /* fetch map_value_ptr from the stack of this function */ 10778 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 10779 /* write into map value */ 10780 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10781 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10782 /* second time with fp-16 */ 10783 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 10784 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10785 /* fetch secound map_value_ptr from the stack */ 10786 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 10787 /* write into map value */ 10788 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10789 BPF_EXIT_INSN(), 10790 10791 /* subprog 2 */ 10792 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10793 /* lookup from map */ 10794 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10795 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10796 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10797 BPF_LD_MAP_FD(BPF_REG_1, 0), 10798 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10799 BPF_FUNC_map_lookup_elem), 10800 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10801 BPF_MOV64_IMM(BPF_REG_0, 0), 10802 BPF_EXIT_INSN(), /* return 0 */ 10803 /* write map_value_ptr into stack frame of main prog */ 10804 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10805 BPF_MOV64_IMM(BPF_REG_0, 1), 10806 BPF_EXIT_INSN(), /* return 1 */ 10807 }, 10808 .prog_type = BPF_PROG_TYPE_XDP, 10809 .fixup_map1 = { 23 }, 10810 .result = REJECT, 10811 .errstr = "invalid read from stack off -16+0 size 8", 10812 }, 10813 { 10814 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1", 10815 .insns = { 10816 /* main prog */ 10817 /* pass fp-16, fp-8 into a function */ 10818 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10819 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10820 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10821 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10822 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10823 BPF_MOV64_IMM(BPF_REG_0, 0), 10824 BPF_EXIT_INSN(), 10825 10826 /* subprog 1 */ 10827 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10828 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10829 /* 1st lookup from map */ 10830 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10831 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10832 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10833 BPF_LD_MAP_FD(BPF_REG_1, 0), 10834 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10835 BPF_FUNC_map_lookup_elem), 10836 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10837 BPF_MOV64_IMM(BPF_REG_8, 0), 10838 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10839 /* write map_value_ptr into stack frame of main prog at fp-8 */ 10840 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10841 BPF_MOV64_IMM(BPF_REG_8, 1), 10842 10843 /* 2nd lookup from map */ 10844 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 10845 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10846 BPF_LD_MAP_FD(BPF_REG_1, 0), 10847 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 10848 BPF_FUNC_map_lookup_elem), 10849 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10850 BPF_MOV64_IMM(BPF_REG_9, 0), 10851 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10852 /* write map_value_ptr into stack frame of main prog at fp-16 */ 10853 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10854 BPF_MOV64_IMM(BPF_REG_9, 1), 10855 10856 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 10857 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 10858 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 10859 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 10860 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 10861 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 10862 BPF_EXIT_INSN(), 10863 10864 /* subprog 2 */ 10865 /* if arg2 == 1 do *arg1 = 0 */ 10866 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 10867 /* fetch map_value_ptr from the stack of this function */ 10868 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 10869 /* write into map value */ 10870 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10871 10872 /* if arg4 == 1 do *arg3 = 0 */ 10873 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 10874 /* fetch map_value_ptr from the stack of this function */ 10875 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 10876 /* write into map value */ 10877 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 10878 BPF_EXIT_INSN(), 10879 }, 10880 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10881 .fixup_map1 = { 12, 22 }, 10882 .result = REJECT, 10883 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 10884 }, 10885 { 10886 "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2", 10887 .insns = { 10888 /* main prog */ 10889 /* pass fp-16, fp-8 into a function */ 10890 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10891 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10892 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10893 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10894 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10895 BPF_MOV64_IMM(BPF_REG_0, 0), 10896 BPF_EXIT_INSN(), 10897 10898 /* subprog 1 */ 10899 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10900 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10901 /* 1st lookup from map */ 10902 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10903 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10904 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10905 BPF_LD_MAP_FD(BPF_REG_1, 0), 10906 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10907 BPF_FUNC_map_lookup_elem), 10908 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10909 BPF_MOV64_IMM(BPF_REG_8, 0), 10910 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10911 /* write map_value_ptr into stack frame of main prog at fp-8 */ 10912 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10913 BPF_MOV64_IMM(BPF_REG_8, 1), 10914 10915 /* 2nd lookup from map */ 10916 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 10917 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 10918 BPF_LD_MAP_FD(BPF_REG_1, 0), 10919 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 10920 BPF_FUNC_map_lookup_elem), 10921 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10922 BPF_MOV64_IMM(BPF_REG_9, 0), 10923 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10924 /* write map_value_ptr into stack frame of main prog at fp-16 */ 10925 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10926 BPF_MOV64_IMM(BPF_REG_9, 1), 10927 10928 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 10929 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 10930 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 10931 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 10932 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 10933 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 10934 BPF_EXIT_INSN(), 10935 10936 /* subprog 2 */ 10937 /* if arg2 == 1 do *arg1 = 0 */ 10938 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 10939 /* fetch map_value_ptr from the stack of this function */ 10940 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 10941 /* write into map value */ 10942 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10943 10944 /* if arg4 == 1 do *arg3 = 0 */ 10945 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 10946 /* fetch map_value_ptr from the stack of this function */ 10947 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 10948 /* write into map value */ 10949 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10950 BPF_EXIT_INSN(), 10951 }, 10952 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 10953 .fixup_map1 = { 12, 22 }, 10954 .result = ACCEPT, 10955 }, 10956 { 10957 "calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3", 10958 .insns = { 10959 /* main prog */ 10960 /* pass fp-16, fp-8 into a function */ 10961 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10962 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10963 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10964 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10965 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 10966 BPF_MOV64_IMM(BPF_REG_0, 0), 10967 BPF_EXIT_INSN(), 10968 10969 /* subprog 1 */ 10970 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10971 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10972 /* 1st lookup from map */ 10973 BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0), 10974 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10975 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 10976 BPF_LD_MAP_FD(BPF_REG_1, 0), 10977 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10978 BPF_FUNC_map_lookup_elem), 10979 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10980 BPF_MOV64_IMM(BPF_REG_8, 0), 10981 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10982 /* write map_value_ptr into stack frame of main prog at fp-8 */ 10983 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 10984 BPF_MOV64_IMM(BPF_REG_8, 1), 10985 10986 /* 2nd lookup from map */ 10987 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10988 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 10989 BPF_LD_MAP_FD(BPF_REG_1, 0), 10990 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 10991 BPF_FUNC_map_lookup_elem), 10992 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 10993 BPF_MOV64_IMM(BPF_REG_9, 0), // 26 10994 BPF_JMP_IMM(BPF_JA, 0, 0, 2), 10995 /* write map_value_ptr into stack frame of main prog at fp-16 */ 10996 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 10997 BPF_MOV64_IMM(BPF_REG_9, 1), 10998 10999 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 11000 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30 11001 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 11002 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 11003 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 11004 BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34 11005 BPF_JMP_IMM(BPF_JA, 0, 0, -30), 11006 11007 /* subprog 2 */ 11008 /* if arg2 == 1 do *arg1 = 0 */ 11009 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 11010 /* fetch map_value_ptr from the stack of this function */ 11011 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 11012 /* write into map value */ 11013 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11014 11015 /* if arg4 == 1 do *arg3 = 0 */ 11016 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 11017 /* fetch map_value_ptr from the stack of this function */ 11018 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 11019 /* write into map value */ 11020 BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 11021 BPF_JMP_IMM(BPF_JA, 0, 0, -8), 11022 }, 11023 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11024 .fixup_map1 = { 12, 22 }, 11025 .result = REJECT, 11026 .errstr = "invalid access to map value, value_size=8 off=2 size=8", 11027 }, 11028 { 11029 "calls: two calls that receive map_value_ptr_or_null via arg. test1", 11030 .insns = { 11031 /* main prog */ 11032 /* pass fp-16, fp-8 into a function */ 11033 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11034 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11035 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11036 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11037 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11038 BPF_MOV64_IMM(BPF_REG_0, 0), 11039 BPF_EXIT_INSN(), 11040 11041 /* subprog 1 */ 11042 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11043 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11044 /* 1st lookup from map */ 11045 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11046 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11047 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11048 BPF_LD_MAP_FD(BPF_REG_1, 0), 11049 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11050 BPF_FUNC_map_lookup_elem), 11051 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 11052 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11053 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11054 BPF_MOV64_IMM(BPF_REG_8, 0), 11055 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11056 BPF_MOV64_IMM(BPF_REG_8, 1), 11057 11058 /* 2nd lookup from map */ 11059 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11060 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11061 BPF_LD_MAP_FD(BPF_REG_1, 0), 11062 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11063 BPF_FUNC_map_lookup_elem), 11064 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 11065 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11066 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11067 BPF_MOV64_IMM(BPF_REG_9, 0), 11068 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11069 BPF_MOV64_IMM(BPF_REG_9, 1), 11070 11071 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 11072 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11073 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 11074 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 11075 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 11076 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11077 BPF_EXIT_INSN(), 11078 11079 /* subprog 2 */ 11080 /* if arg2 == 1 do *arg1 = 0 */ 11081 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 11082 /* fetch map_value_ptr from the stack of this function */ 11083 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 11084 /* write into map value */ 11085 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11086 11087 /* if arg4 == 1 do *arg3 = 0 */ 11088 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 11089 /* fetch map_value_ptr from the stack of this function */ 11090 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 11091 /* write into map value */ 11092 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11093 BPF_EXIT_INSN(), 11094 }, 11095 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11096 .fixup_map1 = { 12, 22 }, 11097 .result = ACCEPT, 11098 }, 11099 { 11100 "calls: two calls that receive map_value_ptr_or_null via arg. test2", 11101 .insns = { 11102 /* main prog */ 11103 /* pass fp-16, fp-8 into a function */ 11104 BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11105 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11106 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11107 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11108 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11109 BPF_MOV64_IMM(BPF_REG_0, 0), 11110 BPF_EXIT_INSN(), 11111 11112 /* subprog 1 */ 11113 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11114 BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11115 /* 1st lookup from map */ 11116 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11117 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11118 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11119 BPF_LD_MAP_FD(BPF_REG_1, 0), 11120 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11121 BPF_FUNC_map_lookup_elem), 11122 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 11123 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11124 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11125 BPF_MOV64_IMM(BPF_REG_8, 0), 11126 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11127 BPF_MOV64_IMM(BPF_REG_8, 1), 11128 11129 /* 2nd lookup from map */ 11130 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11131 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11132 BPF_LD_MAP_FD(BPF_REG_1, 0), 11133 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11134 BPF_FUNC_map_lookup_elem), 11135 /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 11136 BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 11137 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11138 BPF_MOV64_IMM(BPF_REG_9, 0), 11139 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 11140 BPF_MOV64_IMM(BPF_REG_9, 1), 11141 11142 /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 11143 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11144 BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 11145 BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 11146 BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 11147 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11148 BPF_EXIT_INSN(), 11149 11150 /* subprog 2 */ 11151 /* if arg2 == 1 do *arg1 = 0 */ 11152 BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 11153 /* fetch map_value_ptr from the stack of this function */ 11154 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 11155 /* write into map value */ 11156 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11157 11158 /* if arg4 == 0 do *arg3 = 0 */ 11159 BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2), 11160 /* fetch map_value_ptr from the stack of this function */ 11161 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 11162 /* write into map value */ 11163 BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11164 BPF_EXIT_INSN(), 11165 }, 11166 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11167 .fixup_map1 = { 12, 22 }, 11168 .result = REJECT, 11169 .errstr = "R0 invalid mem access 'inv'", 11170 }, 11171 { 11172 "calls: pkt_ptr spill into caller stack", 11173 .insns = { 11174 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11175 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11176 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11177 BPF_EXIT_INSN(), 11178 11179 /* subprog 1 */ 11180 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11181 offsetof(struct __sk_buff, data)), 11182 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11183 offsetof(struct __sk_buff, data_end)), 11184 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11185 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11186 /* spill unchecked pkt_ptr into stack of caller */ 11187 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11188 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 11189 /* now the pkt range is verified, read pkt_ptr from stack */ 11190 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 11191 /* write 4 bytes into packet */ 11192 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11193 BPF_EXIT_INSN(), 11194 }, 11195 .result = ACCEPT, 11196 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11197 .retval = POINTER_VALUE, 11198 }, 11199 { 11200 "calls: pkt_ptr spill into caller stack 2", 11201 .insns = { 11202 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11203 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11204 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11205 /* Marking is still kept, but not in all cases safe. */ 11206 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11207 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 11208 BPF_EXIT_INSN(), 11209 11210 /* subprog 1 */ 11211 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11212 offsetof(struct __sk_buff, data)), 11213 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11214 offsetof(struct __sk_buff, data_end)), 11215 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11216 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11217 /* spill unchecked pkt_ptr into stack of caller */ 11218 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11219 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 11220 /* now the pkt range is verified, read pkt_ptr from stack */ 11221 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 11222 /* write 4 bytes into packet */ 11223 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11224 BPF_EXIT_INSN(), 11225 }, 11226 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11227 .errstr = "invalid access to packet", 11228 .result = REJECT, 11229 }, 11230 { 11231 "calls: pkt_ptr spill into caller stack 3", 11232 .insns = { 11233 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11234 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11235 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11236 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 11237 /* Marking is still kept and safe here. */ 11238 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11239 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 11240 BPF_EXIT_INSN(), 11241 11242 /* subprog 1 */ 11243 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11244 offsetof(struct __sk_buff, data)), 11245 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11246 offsetof(struct __sk_buff, data_end)), 11247 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11248 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11249 /* spill unchecked pkt_ptr into stack of caller */ 11250 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11251 BPF_MOV64_IMM(BPF_REG_5, 0), 11252 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 11253 BPF_MOV64_IMM(BPF_REG_5, 1), 11254 /* now the pkt range is verified, read pkt_ptr from stack */ 11255 BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 11256 /* write 4 bytes into packet */ 11257 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11258 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11259 BPF_EXIT_INSN(), 11260 }, 11261 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11262 .result = ACCEPT, 11263 .retval = 1, 11264 }, 11265 { 11266 "calls: pkt_ptr spill into caller stack 4", 11267 .insns = { 11268 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11269 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11270 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11271 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 11272 /* Check marking propagated. */ 11273 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11274 BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 11275 BPF_EXIT_INSN(), 11276 11277 /* subprog 1 */ 11278 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11279 offsetof(struct __sk_buff, data)), 11280 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11281 offsetof(struct __sk_buff, data_end)), 11282 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11283 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11284 /* spill unchecked pkt_ptr into stack of caller */ 11285 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11286 BPF_MOV64_IMM(BPF_REG_5, 0), 11287 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 11288 BPF_MOV64_IMM(BPF_REG_5, 1), 11289 /* don't read back pkt_ptr from stack here */ 11290 /* write 4 bytes into packet */ 11291 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11292 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11293 BPF_EXIT_INSN(), 11294 }, 11295 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11296 .result = ACCEPT, 11297 .retval = 1, 11298 }, 11299 { 11300 "calls: pkt_ptr spill into caller stack 5", 11301 .insns = { 11302 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11303 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11304 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0), 11305 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11306 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11307 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 11308 BPF_EXIT_INSN(), 11309 11310 /* subprog 1 */ 11311 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11312 offsetof(struct __sk_buff, data)), 11313 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11314 offsetof(struct __sk_buff, data_end)), 11315 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11316 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11317 BPF_MOV64_IMM(BPF_REG_5, 0), 11318 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 11319 /* spill checked pkt_ptr into stack of caller */ 11320 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11321 BPF_MOV64_IMM(BPF_REG_5, 1), 11322 /* don't read back pkt_ptr from stack here */ 11323 /* write 4 bytes into packet */ 11324 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11325 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11326 BPF_EXIT_INSN(), 11327 }, 11328 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11329 .errstr = "same insn cannot be used with different", 11330 .result = REJECT, 11331 }, 11332 { 11333 "calls: pkt_ptr spill into caller stack 6", 11334 .insns = { 11335 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11336 offsetof(struct __sk_buff, data_end)), 11337 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11338 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11339 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11340 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11341 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11342 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 11343 BPF_EXIT_INSN(), 11344 11345 /* subprog 1 */ 11346 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11347 offsetof(struct __sk_buff, data)), 11348 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11349 offsetof(struct __sk_buff, data_end)), 11350 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11351 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11352 BPF_MOV64_IMM(BPF_REG_5, 0), 11353 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 11354 /* spill checked pkt_ptr into stack of caller */ 11355 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11356 BPF_MOV64_IMM(BPF_REG_5, 1), 11357 /* don't read back pkt_ptr from stack here */ 11358 /* write 4 bytes into packet */ 11359 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11360 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11361 BPF_EXIT_INSN(), 11362 }, 11363 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11364 .errstr = "R4 invalid mem access", 11365 .result = REJECT, 11366 }, 11367 { 11368 "calls: pkt_ptr spill into caller stack 7", 11369 .insns = { 11370 BPF_MOV64_IMM(BPF_REG_2, 0), 11371 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11372 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11373 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11374 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11375 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11376 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 11377 BPF_EXIT_INSN(), 11378 11379 /* subprog 1 */ 11380 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11381 offsetof(struct __sk_buff, data)), 11382 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11383 offsetof(struct __sk_buff, data_end)), 11384 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11385 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11386 BPF_MOV64_IMM(BPF_REG_5, 0), 11387 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 11388 /* spill checked pkt_ptr into stack of caller */ 11389 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11390 BPF_MOV64_IMM(BPF_REG_5, 1), 11391 /* don't read back pkt_ptr from stack here */ 11392 /* write 4 bytes into packet */ 11393 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11394 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11395 BPF_EXIT_INSN(), 11396 }, 11397 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11398 .errstr = "R4 invalid mem access", 11399 .result = REJECT, 11400 }, 11401 { 11402 "calls: pkt_ptr spill into caller stack 8", 11403 .insns = { 11404 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11405 offsetof(struct __sk_buff, data)), 11406 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11407 offsetof(struct __sk_buff, data_end)), 11408 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11409 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11410 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 11411 BPF_EXIT_INSN(), 11412 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11413 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11414 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11415 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11416 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11417 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 11418 BPF_EXIT_INSN(), 11419 11420 /* subprog 1 */ 11421 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11422 offsetof(struct __sk_buff, data)), 11423 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11424 offsetof(struct __sk_buff, data_end)), 11425 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11426 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11427 BPF_MOV64_IMM(BPF_REG_5, 0), 11428 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 11429 /* spill checked pkt_ptr into stack of caller */ 11430 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11431 BPF_MOV64_IMM(BPF_REG_5, 1), 11432 /* don't read back pkt_ptr from stack here */ 11433 /* write 4 bytes into packet */ 11434 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11435 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11436 BPF_EXIT_INSN(), 11437 }, 11438 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11439 .result = ACCEPT, 11440 }, 11441 { 11442 "calls: pkt_ptr spill into caller stack 9", 11443 .insns = { 11444 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11445 offsetof(struct __sk_buff, data)), 11446 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11447 offsetof(struct __sk_buff, data_end)), 11448 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11449 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11450 BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 11451 BPF_EXIT_INSN(), 11452 BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 11453 BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 11454 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11455 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11456 BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 11457 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 11458 BPF_EXIT_INSN(), 11459 11460 /* subprog 1 */ 11461 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11462 offsetof(struct __sk_buff, data)), 11463 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11464 offsetof(struct __sk_buff, data_end)), 11465 BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 11466 BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 11467 BPF_MOV64_IMM(BPF_REG_5, 0), 11468 /* spill unchecked pkt_ptr into stack of caller */ 11469 BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 11470 BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 11471 BPF_MOV64_IMM(BPF_REG_5, 1), 11472 /* don't read back pkt_ptr from stack here */ 11473 /* write 4 bytes into packet */ 11474 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11475 BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 11476 BPF_EXIT_INSN(), 11477 }, 11478 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11479 .errstr = "invalid access to packet", 11480 .result = REJECT, 11481 }, 11482 { 11483 "calls: caller stack init to zero or map_value_or_null", 11484 .insns = { 11485 BPF_MOV64_IMM(BPF_REG_0, 0), 11486 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 11487 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11488 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11489 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11490 /* fetch map_value_or_null or const_zero from stack */ 11491 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 11492 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 11493 /* store into map_value */ 11494 BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0), 11495 BPF_EXIT_INSN(), 11496 11497 /* subprog 1 */ 11498 /* if (ctx == 0) return; */ 11499 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8), 11500 /* else bpf_map_lookup() and *(fp - 8) = r0 */ 11501 BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 11502 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11503 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11504 BPF_LD_MAP_FD(BPF_REG_1, 0), 11505 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11506 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11507 BPF_FUNC_map_lookup_elem), 11508 /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 11509 BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11510 BPF_EXIT_INSN(), 11511 }, 11512 .fixup_map1 = { 13 }, 11513 .result = ACCEPT, 11514 .prog_type = BPF_PROG_TYPE_XDP, 11515 }, 11516 { 11517 "calls: stack init to zero and pruning", 11518 .insns = { 11519 /* first make allocated_stack 16 byte */ 11520 BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 11521 /* now fork the execution such that the false branch 11522 * of JGT insn will be verified second and it skisp zero 11523 * init of fp-8 stack slot. If stack liveness marking 11524 * is missing live_read marks from call map_lookup 11525 * processing then pruning will incorrectly assume 11526 * that fp-8 stack slot was unused in the fall-through 11527 * branch and will accept the program incorrectly 11528 */ 11529 BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2), 11530 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11531 BPF_JMP_IMM(BPF_JA, 0, 0, 0), 11532 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11533 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11534 BPF_LD_MAP_FD(BPF_REG_1, 0), 11535 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11536 BPF_FUNC_map_lookup_elem), 11537 BPF_EXIT_INSN(), 11538 }, 11539 .fixup_map2 = { 6 }, 11540 .errstr = "invalid indirect read from stack off -8+0 size 8", 11541 .result = REJECT, 11542 .prog_type = BPF_PROG_TYPE_XDP, 11543 }, 11544 { 11545 "search pruning: all branches should be verified (nop operation)", 11546 .insns = { 11547 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11548 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11549 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 11550 BPF_LD_MAP_FD(BPF_REG_1, 0), 11551 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 11552 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), 11553 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 11554 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 11555 BPF_MOV64_IMM(BPF_REG_4, 0), 11556 BPF_JMP_A(1), 11557 BPF_MOV64_IMM(BPF_REG_4, 1), 11558 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 11559 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 11560 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 11561 BPF_JMP_IMM(BPF_JEQ, BPF_REG_5, 0, 2), 11562 BPF_MOV64_IMM(BPF_REG_6, 0), 11563 BPF_ST_MEM(BPF_DW, BPF_REG_6, 0, 0xdead), 11564 BPF_EXIT_INSN(), 11565 }, 11566 .fixup_map1 = { 3 }, 11567 .errstr = "R6 invalid mem access 'inv'", 11568 .result = REJECT, 11569 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11570 }, 11571 { 11572 "search pruning: all branches should be verified (invalid stack access)", 11573 .insns = { 11574 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11575 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11576 BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 11577 BPF_LD_MAP_FD(BPF_REG_1, 0), 11578 BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 11579 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), 11580 BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 0), 11581 BPF_MOV64_IMM(BPF_REG_4, 0), 11582 BPF_JMP_IMM(BPF_JEQ, BPF_REG_3, 0xbeef, 2), 11583 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -16), 11584 BPF_JMP_A(1), 11585 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_4, -24), 11586 BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns), 11587 BPF_LDX_MEM(BPF_DW, BPF_REG_5, BPF_REG_10, -16), 11588 BPF_EXIT_INSN(), 11589 }, 11590 .fixup_map1 = { 3 }, 11591 .errstr = "invalid read from stack off -16+0 size 8", 11592 .result = REJECT, 11593 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11594 }, 11595 { 11596 "jit: lsh, rsh, arsh by 1", 11597 .insns = { 11598 BPF_MOV64_IMM(BPF_REG_0, 1), 11599 BPF_MOV64_IMM(BPF_REG_1, 0xff), 11600 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1), 11601 BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1), 11602 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1), 11603 BPF_EXIT_INSN(), 11604 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1), 11605 BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1), 11606 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1), 11607 BPF_EXIT_INSN(), 11608 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1), 11609 BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1), 11610 BPF_EXIT_INSN(), 11611 BPF_MOV64_IMM(BPF_REG_0, 2), 11612 BPF_EXIT_INSN(), 11613 }, 11614 .result = ACCEPT, 11615 .retval = 2, 11616 }, 11617 { 11618 "jit: mov32 for ldimm64, 1", 11619 .insns = { 11620 BPF_MOV64_IMM(BPF_REG_0, 2), 11621 BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL), 11622 BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32), 11623 BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL), 11624 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 11625 BPF_MOV64_IMM(BPF_REG_0, 1), 11626 BPF_EXIT_INSN(), 11627 }, 11628 .result = ACCEPT, 11629 .retval = 2, 11630 }, 11631 { 11632 "jit: mov32 for ldimm64, 2", 11633 .insns = { 11634 BPF_MOV64_IMM(BPF_REG_0, 1), 11635 BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL), 11636 BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL), 11637 BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 11638 BPF_MOV64_IMM(BPF_REG_0, 2), 11639 BPF_EXIT_INSN(), 11640 }, 11641 .result = ACCEPT, 11642 .retval = 2, 11643 }, 11644 { 11645 "jit: various mul tests", 11646 .insns = { 11647 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 11648 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 11649 BPF_LD_IMM64(BPF_REG_1, 0xefefefULL), 11650 BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 11651 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 11652 BPF_MOV64_IMM(BPF_REG_0, 1), 11653 BPF_EXIT_INSN(), 11654 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 11655 BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 11656 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 11657 BPF_MOV64_IMM(BPF_REG_0, 1), 11658 BPF_EXIT_INSN(), 11659 BPF_MOV32_REG(BPF_REG_2, BPF_REG_2), 11660 BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL), 11661 BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1), 11662 BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2), 11663 BPF_MOV64_IMM(BPF_REG_0, 1), 11664 BPF_EXIT_INSN(), 11665 BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL), 11666 BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1), 11667 BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2), 11668 BPF_MOV64_IMM(BPF_REG_0, 1), 11669 BPF_EXIT_INSN(), 11670 BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL), 11671 BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL), 11672 BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL), 11673 BPF_ALU32_REG(BPF_MUL, BPF_REG_2, BPF_REG_1), 11674 BPF_JMP_REG(BPF_JEQ, BPF_REG_2, BPF_REG_0, 2), 11675 BPF_MOV64_IMM(BPF_REG_0, 1), 11676 BPF_EXIT_INSN(), 11677 BPF_MOV64_IMM(BPF_REG_0, 2), 11678 BPF_EXIT_INSN(), 11679 }, 11680 .result = ACCEPT, 11681 .retval = 2, 11682 }, 11683 { 11684 "xadd/w check unaligned stack", 11685 .insns = { 11686 BPF_MOV64_IMM(BPF_REG_0, 1), 11687 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 11688 BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7), 11689 BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 11690 BPF_EXIT_INSN(), 11691 }, 11692 .result = REJECT, 11693 .errstr = "misaligned stack access off", 11694 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11695 }, 11696 { 11697 "xadd/w check unaligned map", 11698 .insns = { 11699 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11700 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11701 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11702 BPF_LD_MAP_FD(BPF_REG_1, 0), 11703 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11704 BPF_FUNC_map_lookup_elem), 11705 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 11706 BPF_EXIT_INSN(), 11707 BPF_MOV64_IMM(BPF_REG_1, 1), 11708 BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3), 11709 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3), 11710 BPF_EXIT_INSN(), 11711 }, 11712 .fixup_map1 = { 3 }, 11713 .result = REJECT, 11714 .errstr = "misaligned value access off", 11715 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11716 }, 11717 { 11718 "xadd/w check unaligned pkt", 11719 .insns = { 11720 BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 11721 offsetof(struct xdp_md, data)), 11722 BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 11723 offsetof(struct xdp_md, data_end)), 11724 BPF_MOV64_REG(BPF_REG_1, BPF_REG_2), 11725 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8), 11726 BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2), 11727 BPF_MOV64_IMM(BPF_REG_0, 99), 11728 BPF_JMP_IMM(BPF_JA, 0, 0, 6), 11729 BPF_MOV64_IMM(BPF_REG_0, 1), 11730 BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 11731 BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0), 11732 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1), 11733 BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2), 11734 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1), 11735 BPF_EXIT_INSN(), 11736 }, 11737 .result = REJECT, 11738 .errstr = "BPF_XADD stores into R2 packet", 11739 .prog_type = BPF_PROG_TYPE_XDP, 11740 }, 11741 { 11742 "bpf_get_stack return R0 within range", 11743 .insns = { 11744 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11745 BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11746 BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11747 BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11748 BPF_LD_MAP_FD(BPF_REG_1, 0), 11749 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11750 BPF_FUNC_map_lookup_elem), 11751 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 28), 11752 BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 11753 BPF_MOV64_IMM(BPF_REG_9, sizeof(struct test_val)), 11754 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11755 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 11756 BPF_MOV64_IMM(BPF_REG_3, sizeof(struct test_val)), 11757 BPF_MOV64_IMM(BPF_REG_4, 256), 11758 BPF_EMIT_CALL(BPF_FUNC_get_stack), 11759 BPF_MOV64_IMM(BPF_REG_1, 0), 11760 BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 11761 BPF_ALU64_IMM(BPF_LSH, BPF_REG_8, 32), 11762 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_8, 32), 11763 BPF_JMP_REG(BPF_JSLT, BPF_REG_1, BPF_REG_8, 16), 11764 BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_8), 11765 BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), 11766 BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_8), 11767 BPF_MOV64_REG(BPF_REG_1, BPF_REG_9), 11768 BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32), 11769 BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 32), 11770 BPF_MOV64_REG(BPF_REG_3, BPF_REG_2), 11771 BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_1), 11772 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11773 BPF_MOV64_IMM(BPF_REG_5, sizeof(struct test_val)), 11774 BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_5), 11775 BPF_JMP_REG(BPF_JGE, BPF_REG_3, BPF_REG_1, 4), 11776 BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 11777 BPF_MOV64_REG(BPF_REG_3, BPF_REG_9), 11778 BPF_MOV64_IMM(BPF_REG_4, 0), 11779 BPF_EMIT_CALL(BPF_FUNC_get_stack), 11780 BPF_EXIT_INSN(), 11781 }, 11782 .fixup_map2 = { 4 }, 11783 .result = ACCEPT, 11784 .prog_type = BPF_PROG_TYPE_TRACEPOINT, 11785 }, 11786 { 11787 "ld_abs: invalid op 1", 11788 .insns = { 11789 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11790 BPF_LD_ABS(BPF_DW, 0), 11791 BPF_EXIT_INSN(), 11792 }, 11793 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11794 .result = REJECT, 11795 .errstr = "unknown opcode", 11796 }, 11797 { 11798 "ld_abs: invalid op 2", 11799 .insns = { 11800 BPF_MOV32_IMM(BPF_REG_0, 256), 11801 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11802 BPF_LD_IND(BPF_DW, BPF_REG_0, 0), 11803 BPF_EXIT_INSN(), 11804 }, 11805 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11806 .result = REJECT, 11807 .errstr = "unknown opcode", 11808 }, 11809 { 11810 "ld_abs: nmap reduced", 11811 .insns = { 11812 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11813 BPF_LD_ABS(BPF_H, 12), 11814 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28), 11815 BPF_LD_ABS(BPF_H, 12), 11816 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26), 11817 BPF_MOV32_IMM(BPF_REG_0, 18), 11818 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64), 11819 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64), 11820 BPF_LD_IND(BPF_W, BPF_REG_7, 14), 11821 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60), 11822 BPF_MOV32_IMM(BPF_REG_0, 280971478), 11823 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 11824 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 11825 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60), 11826 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 11827 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15), 11828 BPF_LD_ABS(BPF_H, 12), 11829 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13), 11830 BPF_MOV32_IMM(BPF_REG_0, 22), 11831 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56), 11832 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56), 11833 BPF_LD_IND(BPF_H, BPF_REG_7, 14), 11834 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52), 11835 BPF_MOV32_IMM(BPF_REG_0, 17366), 11836 BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48), 11837 BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48), 11838 BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52), 11839 BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7), 11840 BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11841 BPF_MOV32_IMM(BPF_REG_0, 256), 11842 BPF_EXIT_INSN(), 11843 BPF_MOV32_IMM(BPF_REG_0, 0), 11844 BPF_EXIT_INSN(), 11845 }, 11846 .data = { 11847 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 11848 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11849 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 11850 }, 11851 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11852 .result = ACCEPT, 11853 .retval = 256, 11854 }, 11855 { 11856 "ld_abs: div + abs, test 1", 11857 .insns = { 11858 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 11859 BPF_LD_ABS(BPF_B, 3), 11860 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 11861 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 11862 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 11863 BPF_LD_ABS(BPF_B, 4), 11864 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 11865 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 11866 BPF_EXIT_INSN(), 11867 }, 11868 .data = { 11869 10, 20, 30, 40, 50, 11870 }, 11871 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11872 .result = ACCEPT, 11873 .retval = 10, 11874 }, 11875 { 11876 "ld_abs: div + abs, test 2", 11877 .insns = { 11878 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 11879 BPF_LD_ABS(BPF_B, 3), 11880 BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2), 11881 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2), 11882 BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0), 11883 BPF_LD_ABS(BPF_B, 128), 11884 BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 11885 BPF_LD_IND(BPF_B, BPF_REG_8, -70), 11886 BPF_EXIT_INSN(), 11887 }, 11888 .data = { 11889 10, 20, 30, 40, 50, 11890 }, 11891 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11892 .result = ACCEPT, 11893 .retval = 0, 11894 }, 11895 { 11896 "ld_abs: div + abs, test 3", 11897 .insns = { 11898 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 11899 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 11900 BPF_LD_ABS(BPF_B, 3), 11901 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 11902 BPF_EXIT_INSN(), 11903 }, 11904 .data = { 11905 10, 20, 30, 40, 50, 11906 }, 11907 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11908 .result = ACCEPT, 11909 .retval = 0, 11910 }, 11911 { 11912 "ld_abs: div + abs, test 4", 11913 .insns = { 11914 BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1), 11915 BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0), 11916 BPF_LD_ABS(BPF_B, 256), 11917 BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7), 11918 BPF_EXIT_INSN(), 11919 }, 11920 .data = { 11921 10, 20, 30, 40, 50, 11922 }, 11923 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11924 .result = ACCEPT, 11925 .retval = 0, 11926 }, 11927 { 11928 "ld_abs: vlan + abs, test 1", 11929 .insns = { }, 11930 .data = { 11931 0x34, 11932 }, 11933 .fill_helper = bpf_fill_ld_abs_vlan_push_pop, 11934 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11935 .result = ACCEPT, 11936 .retval = 0xbef, 11937 }, 11938 { 11939 "ld_abs: vlan + abs, test 2", 11940 .insns = { 11941 BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11942 BPF_LD_ABS(BPF_B, 0), 11943 BPF_LD_ABS(BPF_H, 0), 11944 BPF_LD_ABS(BPF_W, 0), 11945 BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 11946 BPF_MOV64_IMM(BPF_REG_6, 0), 11947 BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11948 BPF_MOV64_IMM(BPF_REG_2, 1), 11949 BPF_MOV64_IMM(BPF_REG_3, 2), 11950 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 11951 BPF_FUNC_skb_vlan_push), 11952 BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 11953 BPF_LD_ABS(BPF_B, 0), 11954 BPF_LD_ABS(BPF_H, 0), 11955 BPF_LD_ABS(BPF_W, 0), 11956 BPF_MOV64_IMM(BPF_REG_0, 42), 11957 BPF_EXIT_INSN(), 11958 }, 11959 .data = { 11960 0x34, 11961 }, 11962 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11963 .result = ACCEPT, 11964 .retval = 42, 11965 }, 11966 { 11967 "ld_abs: jump around ld_abs", 11968 .insns = { }, 11969 .data = { 11970 10, 11, 11971 }, 11972 .fill_helper = bpf_fill_jump_around_ld_abs, 11973 .prog_type = BPF_PROG_TYPE_SCHED_CLS, 11974 .result = ACCEPT, 11975 .retval = 10, 11976 }, 11977 }; 11978 11979 static int probe_filter_length(const struct bpf_insn *fp) 11980 { 11981 int len; 11982 11983 for (len = MAX_INSNS - 1; len > 0; --len) 11984 if (fp[len].code != 0 || fp[len].imm != 0) 11985 break; 11986 return len + 1; 11987 } 11988 11989 static int create_map(uint32_t size_value, uint32_t max_elem) 11990 { 11991 int fd; 11992 11993 fd = bpf_create_map(BPF_MAP_TYPE_HASH, sizeof(long long), 11994 size_value, max_elem, BPF_F_NO_PREALLOC); 11995 if (fd < 0) 11996 printf("Failed to create hash map '%s'!\n", strerror(errno)); 11997 11998 return fd; 11999 } 12000 12001 static int create_prog_dummy1(void) 12002 { 12003 struct bpf_insn prog[] = { 12004 BPF_MOV64_IMM(BPF_REG_0, 42), 12005 BPF_EXIT_INSN(), 12006 }; 12007 12008 return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog, 12009 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 12010 } 12011 12012 static int create_prog_dummy2(int mfd, int idx) 12013 { 12014 struct bpf_insn prog[] = { 12015 BPF_MOV64_IMM(BPF_REG_3, idx), 12016 BPF_LD_MAP_FD(BPF_REG_2, mfd), 12017 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, 12018 BPF_FUNC_tail_call), 12019 BPF_MOV64_IMM(BPF_REG_0, 41), 12020 BPF_EXIT_INSN(), 12021 }; 12022 12023 return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog, 12024 ARRAY_SIZE(prog), "GPL", 0, NULL, 0); 12025 } 12026 12027 static int create_prog_array(void) 12028 { 12029 int p1key = 0, p2key = 1; 12030 int mfd, p1fd, p2fd; 12031 12032 mfd = bpf_create_map(BPF_MAP_TYPE_PROG_ARRAY, sizeof(int), 12033 sizeof(int), 4, 0); 12034 if (mfd < 0) { 12035 printf("Failed to create prog array '%s'!\n", strerror(errno)); 12036 return -1; 12037 } 12038 12039 p1fd = create_prog_dummy1(); 12040 p2fd = create_prog_dummy2(mfd, p2key); 12041 if (p1fd < 0 || p2fd < 0) 12042 goto out; 12043 if (bpf_map_update_elem(mfd, &p1key, &p1fd, BPF_ANY) < 0) 12044 goto out; 12045 if (bpf_map_update_elem(mfd, &p2key, &p2fd, BPF_ANY) < 0) 12046 goto out; 12047 close(p2fd); 12048 close(p1fd); 12049 12050 return mfd; 12051 out: 12052 close(p2fd); 12053 close(p1fd); 12054 close(mfd); 12055 return -1; 12056 } 12057 12058 static int create_map_in_map(void) 12059 { 12060 int inner_map_fd, outer_map_fd; 12061 12062 inner_map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), 12063 sizeof(int), 1, 0); 12064 if (inner_map_fd < 0) { 12065 printf("Failed to create array '%s'!\n", strerror(errno)); 12066 return inner_map_fd; 12067 } 12068 12069 outer_map_fd = bpf_create_map_in_map(BPF_MAP_TYPE_ARRAY_OF_MAPS, NULL, 12070 sizeof(int), inner_map_fd, 1, 0); 12071 if (outer_map_fd < 0) 12072 printf("Failed to create array of maps '%s'!\n", 12073 strerror(errno)); 12074 12075 close(inner_map_fd); 12076 12077 return outer_map_fd; 12078 } 12079 12080 static char bpf_vlog[UINT_MAX >> 8]; 12081 12082 static void do_test_fixup(struct bpf_test *test, struct bpf_insn *prog, 12083 int *map_fds) 12084 { 12085 int *fixup_map1 = test->fixup_map1; 12086 int *fixup_map2 = test->fixup_map2; 12087 int *fixup_map3 = test->fixup_map3; 12088 int *fixup_prog = test->fixup_prog; 12089 int *fixup_map_in_map = test->fixup_map_in_map; 12090 12091 if (test->fill_helper) 12092 test->fill_helper(test); 12093 12094 /* Allocating HTs with 1 elem is fine here, since we only test 12095 * for verifier and not do a runtime lookup, so the only thing 12096 * that really matters is value size in this case. 12097 */ 12098 if (*fixup_map1) { 12099 map_fds[0] = create_map(sizeof(long long), 1); 12100 do { 12101 prog[*fixup_map1].imm = map_fds[0]; 12102 fixup_map1++; 12103 } while (*fixup_map1); 12104 } 12105 12106 if (*fixup_map2) { 12107 map_fds[1] = create_map(sizeof(struct test_val), 1); 12108 do { 12109 prog[*fixup_map2].imm = map_fds[1]; 12110 fixup_map2++; 12111 } while (*fixup_map2); 12112 } 12113 12114 if (*fixup_map3) { 12115 map_fds[1] = create_map(sizeof(struct other_val), 1); 12116 do { 12117 prog[*fixup_map3].imm = map_fds[1]; 12118 fixup_map3++; 12119 } while (*fixup_map3); 12120 } 12121 12122 if (*fixup_prog) { 12123 map_fds[2] = create_prog_array(); 12124 do { 12125 prog[*fixup_prog].imm = map_fds[2]; 12126 fixup_prog++; 12127 } while (*fixup_prog); 12128 } 12129 12130 if (*fixup_map_in_map) { 12131 map_fds[3] = create_map_in_map(); 12132 do { 12133 prog[*fixup_map_in_map].imm = map_fds[3]; 12134 fixup_map_in_map++; 12135 } while (*fixup_map_in_map); 12136 } 12137 } 12138 12139 static void do_test_single(struct bpf_test *test, bool unpriv, 12140 int *passes, int *errors) 12141 { 12142 int fd_prog, expected_ret, reject_from_alignment; 12143 int prog_len, prog_type = test->prog_type; 12144 struct bpf_insn *prog = test->insns; 12145 int map_fds[MAX_NR_MAPS]; 12146 const char *expected_err; 12147 uint32_t retval; 12148 int i, err; 12149 12150 for (i = 0; i < MAX_NR_MAPS; i++) 12151 map_fds[i] = -1; 12152 12153 do_test_fixup(test, prog, map_fds); 12154 prog_len = probe_filter_length(prog); 12155 12156 fd_prog = bpf_verify_program(prog_type ? : BPF_PROG_TYPE_SOCKET_FILTER, 12157 prog, prog_len, test->flags & F_LOAD_WITH_STRICT_ALIGNMENT, 12158 "GPL", 0, bpf_vlog, sizeof(bpf_vlog), 1); 12159 12160 expected_ret = unpriv && test->result_unpriv != UNDEF ? 12161 test->result_unpriv : test->result; 12162 expected_err = unpriv && test->errstr_unpriv ? 12163 test->errstr_unpriv : test->errstr; 12164 12165 reject_from_alignment = fd_prog < 0 && 12166 (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS) && 12167 strstr(bpf_vlog, "Unknown alignment."); 12168 #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS 12169 if (reject_from_alignment) { 12170 printf("FAIL\nFailed due to alignment despite having efficient unaligned access: '%s'!\n", 12171 strerror(errno)); 12172 goto fail_log; 12173 } 12174 #endif 12175 if (expected_ret == ACCEPT) { 12176 if (fd_prog < 0 && !reject_from_alignment) { 12177 printf("FAIL\nFailed to load prog '%s'!\n", 12178 strerror(errno)); 12179 goto fail_log; 12180 } 12181 } else { 12182 if (fd_prog >= 0) { 12183 printf("FAIL\nUnexpected success to load!\n"); 12184 goto fail_log; 12185 } 12186 if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) { 12187 printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n", 12188 expected_err, bpf_vlog); 12189 goto fail_log; 12190 } 12191 } 12192 12193 if (fd_prog >= 0) { 12194 err = bpf_prog_test_run(fd_prog, 1, test->data, 12195 sizeof(test->data), NULL, NULL, 12196 &retval, NULL); 12197 if (err && errno != 524/*ENOTSUPP*/ && errno != EPERM) { 12198 printf("Unexpected bpf_prog_test_run error\n"); 12199 goto fail_log; 12200 } 12201 if (!err && retval != test->retval && 12202 test->retval != POINTER_VALUE) { 12203 printf("FAIL retval %d != %d\n", retval, test->retval); 12204 goto fail_log; 12205 } 12206 } 12207 (*passes)++; 12208 printf("OK%s\n", reject_from_alignment ? 12209 " (NOTE: reject due to unknown alignment)" : ""); 12210 close_fds: 12211 close(fd_prog); 12212 for (i = 0; i < MAX_NR_MAPS; i++) 12213 close(map_fds[i]); 12214 sched_yield(); 12215 return; 12216 fail_log: 12217 (*errors)++; 12218 printf("%s", bpf_vlog); 12219 goto close_fds; 12220 } 12221 12222 static bool is_admin(void) 12223 { 12224 cap_t caps; 12225 cap_flag_value_t sysadmin = CAP_CLEAR; 12226 const cap_value_t cap_val = CAP_SYS_ADMIN; 12227 12228 #ifdef CAP_IS_SUPPORTED 12229 if (!CAP_IS_SUPPORTED(CAP_SETFCAP)) { 12230 perror("cap_get_flag"); 12231 return false; 12232 } 12233 #endif 12234 caps = cap_get_proc(); 12235 if (!caps) { 12236 perror("cap_get_proc"); 12237 return false; 12238 } 12239 if (cap_get_flag(caps, cap_val, CAP_EFFECTIVE, &sysadmin)) 12240 perror("cap_get_flag"); 12241 if (cap_free(caps)) 12242 perror("cap_free"); 12243 return (sysadmin == CAP_SET); 12244 } 12245 12246 static int set_admin(bool admin) 12247 { 12248 cap_t caps; 12249 const cap_value_t cap_val = CAP_SYS_ADMIN; 12250 int ret = -1; 12251 12252 caps = cap_get_proc(); 12253 if (!caps) { 12254 perror("cap_get_proc"); 12255 return -1; 12256 } 12257 if (cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap_val, 12258 admin ? CAP_SET : CAP_CLEAR)) { 12259 perror("cap_set_flag"); 12260 goto out; 12261 } 12262 if (cap_set_proc(caps)) { 12263 perror("cap_set_proc"); 12264 goto out; 12265 } 12266 ret = 0; 12267 out: 12268 if (cap_free(caps)) 12269 perror("cap_free"); 12270 return ret; 12271 } 12272 12273 static void get_unpriv_disabled() 12274 { 12275 char buf[2]; 12276 FILE *fd; 12277 12278 fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r"); 12279 if (fgets(buf, 2, fd) == buf && atoi(buf)) 12280 unpriv_disabled = true; 12281 fclose(fd); 12282 } 12283 12284 static int do_test(bool unpriv, unsigned int from, unsigned int to) 12285 { 12286 int i, passes = 0, errors = 0, skips = 0; 12287 12288 for (i = from; i < to; i++) { 12289 struct bpf_test *test = &tests[i]; 12290 12291 /* Program types that are not supported by non-root we 12292 * skip right away. 12293 */ 12294 if (!test->prog_type && unpriv_disabled) { 12295 printf("#%d/u %s SKIP\n", i, test->descr); 12296 skips++; 12297 } else if (!test->prog_type) { 12298 if (!unpriv) 12299 set_admin(false); 12300 printf("#%d/u %s ", i, test->descr); 12301 do_test_single(test, true, &passes, &errors); 12302 if (!unpriv) 12303 set_admin(true); 12304 } 12305 12306 if (unpriv) { 12307 printf("#%d/p %s SKIP\n", i, test->descr); 12308 skips++; 12309 } else { 12310 printf("#%d/p %s ", i, test->descr); 12311 do_test_single(test, false, &passes, &errors); 12312 } 12313 } 12314 12315 printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes, 12316 skips, errors); 12317 return errors ? EXIT_FAILURE : EXIT_SUCCESS; 12318 } 12319 12320 int main(int argc, char **argv) 12321 { 12322 unsigned int from = 0, to = ARRAY_SIZE(tests); 12323 bool unpriv = !is_admin(); 12324 12325 if (argc == 3) { 12326 unsigned int l = atoi(argv[argc - 2]); 12327 unsigned int u = atoi(argv[argc - 1]); 12328 12329 if (l < to && u < to) { 12330 from = l; 12331 to = u + 1; 12332 } 12333 } else if (argc == 2) { 12334 unsigned int t = atoi(argv[argc - 1]); 12335 12336 if (t < to) { 12337 from = t; 12338 to = t + 1; 12339 } 12340 } 12341 12342 get_unpriv_disabled(); 12343 if (unpriv && unpriv_disabled) { 12344 printf("Cannot run as unprivileged user with sysctl %s.\n", 12345 UNPRIV_SYSCTL); 12346 return EXIT_FAILURE; 12347 } 12348 12349 return do_test(unpriv, from, to); 12350 } 12351