diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/arch/s390/include/uapi/asm/bpf_perf_event.h | 2 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/Makefile | 2 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/test_progs.c | 8 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/test_verifier.c | 629 | ||||
| -rw-r--r-- | tools/testing/selftests/net/config | 1 |
5 files changed, 593 insertions, 49 deletions
diff --git a/tools/arch/s390/include/uapi/asm/bpf_perf_event.h b/tools/arch/s390/include/uapi/asm/bpf_perf_event.h index cefe7c7cd4f6..0a8e37a519f2 100644 --- a/tools/arch/s390/include/uapi/asm/bpf_perf_event.h +++ b/tools/arch/s390/include/uapi/asm/bpf_perf_event.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | #ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ | 2 | #ifndef _UAPI__ASM_BPF_PERF_EVENT_H__ |
| 3 | #define _UAPI__ASM_BPF_PERF_EVENT_H__ | 3 | #define _UAPI__ASM_BPF_PERF_EVENT_H__ |
| 4 | 4 | ||
| 5 | #include <asm/ptrace.h> | 5 | #include "ptrace.h" |
| 6 | 6 | ||
| 7 | typedef user_pt_regs bpf_user_pt_regs_t; | 7 | typedef user_pt_regs bpf_user_pt_regs_t; |
| 8 | 8 | ||
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index 792af7c3b74f..05fc4e2e7b3a 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile | |||
| @@ -11,7 +11,7 @@ ifneq ($(wildcard $(GENHDR)),) | |||
| 11 | endif | 11 | endif |
| 12 | 12 | ||
| 13 | CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include | 13 | CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include |
| 14 | LDLIBS += -lcap -lelf | 14 | LDLIBS += -lcap -lelf -lrt |
| 15 | 15 | ||
| 16 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ | 16 | TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_lpm_map test_progs \ |
| 17 | test_align test_verifier_log test_dev_cgroup | 17 | test_align test_verifier_log test_dev_cgroup |
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 69427531408d..6761be18a91f 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c | |||
| @@ -351,7 +351,7 @@ static void test_bpf_obj_id(void) | |||
| 351 | info_len != sizeof(struct bpf_map_info) || | 351 | info_len != sizeof(struct bpf_map_info) || |
| 352 | strcmp((char *)map_infos[i].name, expected_map_name), | 352 | strcmp((char *)map_infos[i].name, expected_map_name), |
| 353 | "get-map-info(fd)", | 353 | "get-map-info(fd)", |
| 354 | "err %d errno %d type %d(%d) info_len %u(%lu) key_size %u value_size %u max_entries %u map_flags %X name %s(%s)\n", | 354 | "err %d errno %d type %d(%d) info_len %u(%Zu) key_size %u value_size %u max_entries %u map_flags %X name %s(%s)\n", |
| 355 | err, errno, | 355 | err, errno, |
| 356 | map_infos[i].type, BPF_MAP_TYPE_ARRAY, | 356 | map_infos[i].type, BPF_MAP_TYPE_ARRAY, |
| 357 | info_len, sizeof(struct bpf_map_info), | 357 | info_len, sizeof(struct bpf_map_info), |
| @@ -395,7 +395,7 @@ static void test_bpf_obj_id(void) | |||
| 395 | *(int *)prog_infos[i].map_ids != map_infos[i].id || | 395 | *(int *)prog_infos[i].map_ids != map_infos[i].id || |
| 396 | strcmp((char *)prog_infos[i].name, expected_prog_name), | 396 | strcmp((char *)prog_infos[i].name, expected_prog_name), |
| 397 | "get-prog-info(fd)", | 397 | "get-prog-info(fd)", |
| 398 | "err %d errno %d i %d type %d(%d) info_len %u(%lu) jit_enabled %d jited_prog_len %u xlated_prog_len %u jited_prog %d xlated_prog %d load_time %lu(%lu) uid %u(%u) nr_map_ids %u(%u) map_id %u(%u) name %s(%s)\n", | 398 | "err %d errno %d i %d type %d(%d) info_len %u(%Zu) jit_enabled %d jited_prog_len %u xlated_prog_len %u jited_prog %d xlated_prog %d load_time %lu(%lu) uid %u(%u) nr_map_ids %u(%u) map_id %u(%u) name %s(%s)\n", |
| 399 | err, errno, i, | 399 | err, errno, i, |
| 400 | prog_infos[i].type, BPF_PROG_TYPE_SOCKET_FILTER, | 400 | prog_infos[i].type, BPF_PROG_TYPE_SOCKET_FILTER, |
| 401 | info_len, sizeof(struct bpf_prog_info), | 401 | info_len, sizeof(struct bpf_prog_info), |
| @@ -463,7 +463,7 @@ static void test_bpf_obj_id(void) | |||
| 463 | memcmp(&prog_info, &prog_infos[i], info_len) || | 463 | memcmp(&prog_info, &prog_infos[i], info_len) || |
| 464 | *(int *)prog_info.map_ids != saved_map_id, | 464 | *(int *)prog_info.map_ids != saved_map_id, |
| 465 | "get-prog-info(next_id->fd)", | 465 | "get-prog-info(next_id->fd)", |
| 466 | "err %d errno %d info_len %u(%lu) memcmp %d map_id %u(%u)\n", | 466 | "err %d errno %d info_len %u(%Zu) memcmp %d map_id %u(%u)\n", |
| 467 | err, errno, info_len, sizeof(struct bpf_prog_info), | 467 | err, errno, info_len, sizeof(struct bpf_prog_info), |
| 468 | memcmp(&prog_info, &prog_infos[i], info_len), | 468 | memcmp(&prog_info, &prog_infos[i], info_len), |
| 469 | *(int *)prog_info.map_ids, saved_map_id); | 469 | *(int *)prog_info.map_ids, saved_map_id); |
| @@ -509,7 +509,7 @@ static void test_bpf_obj_id(void) | |||
| 509 | memcmp(&map_info, &map_infos[i], info_len) || | 509 | memcmp(&map_info, &map_infos[i], info_len) || |
| 510 | array_value != array_magic_value, | 510 | array_value != array_magic_value, |
| 511 | "check get-map-info(next_id->fd)", | 511 | "check get-map-info(next_id->fd)", |
| 512 | "err %d errno %d info_len %u(%lu) memcmp %d array_value %llu(%llu)\n", | 512 | "err %d errno %d info_len %u(%Zu) memcmp %d array_value %llu(%llu)\n", |
| 513 | err, errno, info_len, sizeof(struct bpf_map_info), | 513 | err, errno, info_len, sizeof(struct bpf_map_info), |
| 514 | memcmp(&map_info, &map_infos[i], info_len), | 514 | memcmp(&map_info, &map_infos[i], info_len), |
| 515 | array_value, array_magic_value); | 515 | array_value, array_magic_value); |
diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c index 3c64f30cf63c..b51017404c62 100644 --- a/tools/testing/selftests/bpf/test_verifier.c +++ b/tools/testing/selftests/bpf/test_verifier.c | |||
| @@ -422,9 +422,7 @@ static struct bpf_test tests[] = { | |||
| 422 | BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), | 422 | BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), |
| 423 | BPF_EXIT_INSN(), | 423 | BPF_EXIT_INSN(), |
| 424 | }, | 424 | }, |
| 425 | .errstr_unpriv = "R1 subtraction from stack pointer", | 425 | .errstr = "R1 subtraction from stack pointer", |
| 426 | .result_unpriv = REJECT, | ||
| 427 | .errstr = "R1 invalid mem access", | ||
| 428 | .result = REJECT, | 426 | .result = REJECT, |
| 429 | }, | 427 | }, |
| 430 | { | 428 | { |
| @@ -606,7 +604,6 @@ static struct bpf_test tests[] = { | |||
| 606 | }, | 604 | }, |
| 607 | .errstr = "misaligned stack access", | 605 | .errstr = "misaligned stack access", |
| 608 | .result = REJECT, | 606 | .result = REJECT, |
| 609 | .flags = F_LOAD_WITH_STRICT_ALIGNMENT, | ||
| 610 | }, | 607 | }, |
| 611 | { | 608 | { |
| 612 | "invalid map_fd for function call", | 609 | "invalid map_fd for function call", |
| @@ -1797,7 +1794,6 @@ static struct bpf_test tests[] = { | |||
| 1797 | }, | 1794 | }, |
| 1798 | .result = REJECT, | 1795 | .result = REJECT, |
| 1799 | .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", | 1796 | .errstr = "misaligned stack access off (0x0; 0x0)+-8+2 size 8", |
| 1800 | .flags = F_LOAD_WITH_STRICT_ALIGNMENT, | ||
| 1801 | }, | 1797 | }, |
| 1802 | { | 1798 | { |
| 1803 | "PTR_TO_STACK store/load - bad alignment on reg", | 1799 | "PTR_TO_STACK store/load - bad alignment on reg", |
| @@ -1810,7 +1806,6 @@ static struct bpf_test tests[] = { | |||
| 1810 | }, | 1806 | }, |
| 1811 | .result = REJECT, | 1807 | .result = REJECT, |
| 1812 | .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", | 1808 | .errstr = "misaligned stack access off (0x0; 0x0)+-10+8 size 8", |
| 1813 | .flags = F_LOAD_WITH_STRICT_ALIGNMENT, | ||
| 1814 | }, | 1809 | }, |
| 1815 | { | 1810 | { |
| 1816 | "PTR_TO_STACK store/load - out of bounds low", | 1811 | "PTR_TO_STACK store/load - out of bounds low", |
| @@ -1862,9 +1857,8 @@ static struct bpf_test tests[] = { | |||
| 1862 | BPF_MOV64_IMM(BPF_REG_0, 0), | 1857 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 1863 | BPF_EXIT_INSN(), | 1858 | BPF_EXIT_INSN(), |
| 1864 | }, | 1859 | }, |
| 1865 | .result = ACCEPT, | 1860 | .result = REJECT, |
| 1866 | .result_unpriv = REJECT, | 1861 | .errstr = "R1 pointer += pointer", |
| 1867 | .errstr_unpriv = "R1 pointer += pointer", | ||
| 1868 | }, | 1862 | }, |
| 1869 | { | 1863 | { |
| 1870 | "unpriv: neg pointer", | 1864 | "unpriv: neg pointer", |
| @@ -2592,7 +2586,8 @@ static struct bpf_test tests[] = { | |||
| 2592 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, | 2586 | BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, |
| 2593 | offsetof(struct __sk_buff, data)), | 2587 | offsetof(struct __sk_buff, data)), |
| 2594 | BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), | 2588 | BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_4), |
| 2595 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_1), | 2589 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| 2590 | offsetof(struct __sk_buff, len)), | ||
| 2596 | BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), | 2591 | BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 49), |
| 2597 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), | 2592 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 49), |
| 2598 | BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), | 2593 | BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2), |
| @@ -2899,7 +2894,7 @@ static struct bpf_test tests[] = { | |||
| 2899 | BPF_MOV64_IMM(BPF_REG_0, 0), | 2894 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 2900 | BPF_EXIT_INSN(), | 2895 | BPF_EXIT_INSN(), |
| 2901 | }, | 2896 | }, |
| 2902 | .errstr = "invalid access to packet", | 2897 | .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", |
| 2903 | .result = REJECT, | 2898 | .result = REJECT, |
| 2904 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | 2899 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, |
| 2905 | }, | 2900 | }, |
| @@ -3885,9 +3880,7 @@ static struct bpf_test tests[] = { | |||
| 3885 | BPF_EXIT_INSN(), | 3880 | BPF_EXIT_INSN(), |
| 3886 | }, | 3881 | }, |
| 3887 | .fixup_map2 = { 3, 11 }, | 3882 | .fixup_map2 = { 3, 11 }, |
| 3888 | .errstr_unpriv = "R0 pointer += pointer", | 3883 | .errstr = "R0 pointer += pointer", |
| 3889 | .errstr = "R0 invalid mem access 'inv'", | ||
| 3890 | .result_unpriv = REJECT, | ||
| 3891 | .result = REJECT, | 3884 | .result = REJECT, |
| 3892 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, | 3885 | .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, |
| 3893 | }, | 3886 | }, |
| @@ -3928,7 +3921,7 @@ static struct bpf_test tests[] = { | |||
| 3928 | BPF_EXIT_INSN(), | 3921 | BPF_EXIT_INSN(), |
| 3929 | }, | 3922 | }, |
| 3930 | .fixup_map1 = { 4 }, | 3923 | .fixup_map1 = { 4 }, |
| 3931 | .errstr = "R4 invalid mem access", | 3924 | .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", |
| 3932 | .result = REJECT, | 3925 | .result = REJECT, |
| 3933 | .prog_type = BPF_PROG_TYPE_SCHED_CLS | 3926 | .prog_type = BPF_PROG_TYPE_SCHED_CLS |
| 3934 | }, | 3927 | }, |
| @@ -3949,7 +3942,7 @@ static struct bpf_test tests[] = { | |||
| 3949 | BPF_EXIT_INSN(), | 3942 | BPF_EXIT_INSN(), |
| 3950 | }, | 3943 | }, |
| 3951 | .fixup_map1 = { 4 }, | 3944 | .fixup_map1 = { 4 }, |
| 3952 | .errstr = "R4 invalid mem access", | 3945 | .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", |
| 3953 | .result = REJECT, | 3946 | .result = REJECT, |
| 3954 | .prog_type = BPF_PROG_TYPE_SCHED_CLS | 3947 | .prog_type = BPF_PROG_TYPE_SCHED_CLS |
| 3955 | }, | 3948 | }, |
| @@ -3970,7 +3963,7 @@ static struct bpf_test tests[] = { | |||
| 3970 | BPF_EXIT_INSN(), | 3963 | BPF_EXIT_INSN(), |
| 3971 | }, | 3964 | }, |
| 3972 | .fixup_map1 = { 4 }, | 3965 | .fixup_map1 = { 4 }, |
| 3973 | .errstr = "R4 invalid mem access", | 3966 | .errstr = "R4 pointer arithmetic on PTR_TO_MAP_VALUE_OR_NULL", |
| 3974 | .result = REJECT, | 3967 | .result = REJECT, |
| 3975 | .prog_type = BPF_PROG_TYPE_SCHED_CLS | 3968 | .prog_type = BPF_PROG_TYPE_SCHED_CLS |
| 3976 | }, | 3969 | }, |
| @@ -5195,10 +5188,8 @@ static struct bpf_test tests[] = { | |||
| 5195 | BPF_EXIT_INSN(), | 5188 | BPF_EXIT_INSN(), |
| 5196 | }, | 5189 | }, |
| 5197 | .fixup_map2 = { 3 }, | 5190 | .fixup_map2 = { 3 }, |
| 5198 | .errstr_unpriv = "R0 bitwise operator &= on pointer", | 5191 | .errstr = "R0 bitwise operator &= on pointer", |
| 5199 | .errstr = "invalid mem access 'inv'", | ||
| 5200 | .result = REJECT, | 5192 | .result = REJECT, |
| 5201 | .result_unpriv = REJECT, | ||
| 5202 | }, | 5193 | }, |
| 5203 | { | 5194 | { |
| 5204 | "map element value illegal alu op, 2", | 5195 | "map element value illegal alu op, 2", |
| @@ -5214,10 +5205,8 @@ static struct bpf_test tests[] = { | |||
| 5214 | BPF_EXIT_INSN(), | 5205 | BPF_EXIT_INSN(), |
| 5215 | }, | 5206 | }, |
| 5216 | .fixup_map2 = { 3 }, | 5207 | .fixup_map2 = { 3 }, |
| 5217 | .errstr_unpriv = "R0 32-bit pointer arithmetic prohibited", | 5208 | .errstr = "R0 32-bit pointer arithmetic prohibited", |
| 5218 | .errstr = "invalid mem access 'inv'", | ||
| 5219 | .result = REJECT, | 5209 | .result = REJECT, |
| 5220 | .result_unpriv = REJECT, | ||
| 5221 | }, | 5210 | }, |
| 5222 | { | 5211 | { |
| 5223 | "map element value illegal alu op, 3", | 5212 | "map element value illegal alu op, 3", |
| @@ -5233,10 +5222,8 @@ static struct bpf_test tests[] = { | |||
| 5233 | BPF_EXIT_INSN(), | 5222 | BPF_EXIT_INSN(), |
| 5234 | }, | 5223 | }, |
| 5235 | .fixup_map2 = { 3 }, | 5224 | .fixup_map2 = { 3 }, |
| 5236 | .errstr_unpriv = "R0 pointer arithmetic with /= operator", | 5225 | .errstr = "R0 pointer arithmetic with /= operator", |
| 5237 | .errstr = "invalid mem access 'inv'", | ||
| 5238 | .result = REJECT, | 5226 | .result = REJECT, |
| 5239 | .result_unpriv = REJECT, | ||
| 5240 | }, | 5227 | }, |
| 5241 | { | 5228 | { |
| 5242 | "map element value illegal alu op, 4", | 5229 | "map element value illegal alu op, 4", |
| @@ -6019,8 +6006,7 @@ static struct bpf_test tests[] = { | |||
| 6019 | BPF_EXIT_INSN(), | 6006 | BPF_EXIT_INSN(), |
| 6020 | }, | 6007 | }, |
| 6021 | .fixup_map_in_map = { 3 }, | 6008 | .fixup_map_in_map = { 3 }, |
| 6022 | .errstr = "R1 type=inv expected=map_ptr", | 6009 | .errstr = "R1 pointer arithmetic on CONST_PTR_TO_MAP prohibited", |
| 6023 | .errstr_unpriv = "R1 pointer arithmetic on CONST_PTR_TO_MAP prohibited", | ||
| 6024 | .result = REJECT, | 6010 | .result = REJECT, |
| 6025 | }, | 6011 | }, |
| 6026 | { | 6012 | { |
| @@ -6117,6 +6103,30 @@ static struct bpf_test tests[] = { | |||
| 6117 | .result = ACCEPT, | 6103 | .result = ACCEPT, |
| 6118 | }, | 6104 | }, |
| 6119 | { | 6105 | { |
| 6106 | "ld_abs: tests on r6 and skb data reload helper", | ||
| 6107 | .insns = { | ||
| 6108 | BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), | ||
| 6109 | BPF_LD_ABS(BPF_B, 0), | ||
| 6110 | BPF_LD_ABS(BPF_H, 0), | ||
| 6111 | BPF_LD_ABS(BPF_W, 0), | ||
| 6112 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), | ||
| 6113 | BPF_MOV64_IMM(BPF_REG_6, 0), | ||
| 6114 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | ||
| 6115 | BPF_MOV64_IMM(BPF_REG_2, 1), | ||
| 6116 | BPF_MOV64_IMM(BPF_REG_3, 2), | ||
| 6117 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6118 | BPF_FUNC_skb_vlan_push), | ||
| 6119 | BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), | ||
| 6120 | BPF_LD_ABS(BPF_B, 0), | ||
| 6121 | BPF_LD_ABS(BPF_H, 0), | ||
| 6122 | BPF_LD_ABS(BPF_W, 0), | ||
| 6123 | BPF_MOV64_IMM(BPF_REG_0, 42), | ||
| 6124 | BPF_EXIT_INSN(), | ||
| 6125 | }, | ||
| 6126 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | ||
| 6127 | .result = ACCEPT, | ||
| 6128 | }, | ||
| 6129 | { | ||
| 6120 | "ld_ind: check calling conv, r1", | 6130 | "ld_ind: check calling conv, r1", |
| 6121 | .insns = { | 6131 | .insns = { |
| 6122 | BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), | 6132 | BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), |
| @@ -6300,7 +6310,7 @@ static struct bpf_test tests[] = { | |||
| 6300 | BPF_EXIT_INSN(), | 6310 | BPF_EXIT_INSN(), |
| 6301 | }, | 6311 | }, |
| 6302 | .fixup_map1 = { 3 }, | 6312 | .fixup_map1 = { 3 }, |
| 6303 | .errstr = "R0 min value is negative", | 6313 | .errstr = "unbounded min value", |
| 6304 | .result = REJECT, | 6314 | .result = REJECT, |
| 6305 | }, | 6315 | }, |
| 6306 | { | 6316 | { |
| @@ -6324,7 +6334,7 @@ static struct bpf_test tests[] = { | |||
| 6324 | BPF_EXIT_INSN(), | 6334 | BPF_EXIT_INSN(), |
| 6325 | }, | 6335 | }, |
| 6326 | .fixup_map1 = { 3 }, | 6336 | .fixup_map1 = { 3 }, |
| 6327 | .errstr = "R0 min value is negative", | 6337 | .errstr = "unbounded min value", |
| 6328 | .result = REJECT, | 6338 | .result = REJECT, |
| 6329 | }, | 6339 | }, |
| 6330 | { | 6340 | { |
| @@ -6350,7 +6360,7 @@ static struct bpf_test tests[] = { | |||
| 6350 | BPF_EXIT_INSN(), | 6360 | BPF_EXIT_INSN(), |
| 6351 | }, | 6361 | }, |
| 6352 | .fixup_map1 = { 3 }, | 6362 | .fixup_map1 = { 3 }, |
| 6353 | .errstr = "R8 invalid mem access 'inv'", | 6363 | .errstr = "unbounded min value", |
| 6354 | .result = REJECT, | 6364 | .result = REJECT, |
| 6355 | }, | 6365 | }, |
| 6356 | { | 6366 | { |
| @@ -6375,7 +6385,7 @@ static struct bpf_test tests[] = { | |||
| 6375 | BPF_EXIT_INSN(), | 6385 | BPF_EXIT_INSN(), |
| 6376 | }, | 6386 | }, |
| 6377 | .fixup_map1 = { 3 }, | 6387 | .fixup_map1 = { 3 }, |
| 6378 | .errstr = "R8 invalid mem access 'inv'", | 6388 | .errstr = "unbounded min value", |
| 6379 | .result = REJECT, | 6389 | .result = REJECT, |
| 6380 | }, | 6390 | }, |
| 6381 | { | 6391 | { |
| @@ -6423,7 +6433,7 @@ static struct bpf_test tests[] = { | |||
| 6423 | BPF_EXIT_INSN(), | 6433 | BPF_EXIT_INSN(), |
| 6424 | }, | 6434 | }, |
| 6425 | .fixup_map1 = { 3 }, | 6435 | .fixup_map1 = { 3 }, |
| 6426 | .errstr = "R0 min value is negative", | 6436 | .errstr = "unbounded min value", |
| 6427 | .result = REJECT, | 6437 | .result = REJECT, |
| 6428 | }, | 6438 | }, |
| 6429 | { | 6439 | { |
| @@ -6494,7 +6504,7 @@ static struct bpf_test tests[] = { | |||
| 6494 | BPF_EXIT_INSN(), | 6504 | BPF_EXIT_INSN(), |
| 6495 | }, | 6505 | }, |
| 6496 | .fixup_map1 = { 3 }, | 6506 | .fixup_map1 = { 3 }, |
| 6497 | .errstr = "R0 min value is negative", | 6507 | .errstr = "unbounded min value", |
| 6498 | .result = REJECT, | 6508 | .result = REJECT, |
| 6499 | }, | 6509 | }, |
| 6500 | { | 6510 | { |
| @@ -6545,7 +6555,7 @@ static struct bpf_test tests[] = { | |||
| 6545 | BPF_EXIT_INSN(), | 6555 | BPF_EXIT_INSN(), |
| 6546 | }, | 6556 | }, |
| 6547 | .fixup_map1 = { 3 }, | 6557 | .fixup_map1 = { 3 }, |
| 6548 | .errstr = "R0 min value is negative", | 6558 | .errstr = "unbounded min value", |
| 6549 | .result = REJECT, | 6559 | .result = REJECT, |
| 6550 | }, | 6560 | }, |
| 6551 | { | 6561 | { |
| @@ -6572,7 +6582,7 @@ static struct bpf_test tests[] = { | |||
| 6572 | BPF_EXIT_INSN(), | 6582 | BPF_EXIT_INSN(), |
| 6573 | }, | 6583 | }, |
| 6574 | .fixup_map1 = { 3 }, | 6584 | .fixup_map1 = { 3 }, |
| 6575 | .errstr = "R0 min value is negative", | 6585 | .errstr = "unbounded min value", |
| 6576 | .result = REJECT, | 6586 | .result = REJECT, |
| 6577 | }, | 6587 | }, |
| 6578 | { | 6588 | { |
| @@ -6598,7 +6608,7 @@ static struct bpf_test tests[] = { | |||
| 6598 | BPF_EXIT_INSN(), | 6608 | BPF_EXIT_INSN(), |
| 6599 | }, | 6609 | }, |
| 6600 | .fixup_map1 = { 3 }, | 6610 | .fixup_map1 = { 3 }, |
| 6601 | .errstr = "R0 min value is negative", | 6611 | .errstr = "unbounded min value", |
| 6602 | .result = REJECT, | 6612 | .result = REJECT, |
| 6603 | }, | 6613 | }, |
| 6604 | { | 6614 | { |
| @@ -6627,7 +6637,7 @@ static struct bpf_test tests[] = { | |||
| 6627 | BPF_EXIT_INSN(), | 6637 | BPF_EXIT_INSN(), |
| 6628 | }, | 6638 | }, |
| 6629 | .fixup_map1 = { 3 }, | 6639 | .fixup_map1 = { 3 }, |
| 6630 | .errstr = "R0 min value is negative", | 6640 | .errstr = "unbounded min value", |
| 6631 | .result = REJECT, | 6641 | .result = REJECT, |
| 6632 | }, | 6642 | }, |
| 6633 | { | 6643 | { |
| @@ -6657,7 +6667,7 @@ static struct bpf_test tests[] = { | |||
| 6657 | BPF_JMP_IMM(BPF_JA, 0, 0, -7), | 6667 | BPF_JMP_IMM(BPF_JA, 0, 0, -7), |
| 6658 | }, | 6668 | }, |
| 6659 | .fixup_map1 = { 4 }, | 6669 | .fixup_map1 = { 4 }, |
| 6660 | .errstr = "R0 min value is negative", | 6670 | .errstr = "unbounded min value", |
| 6661 | .result = REJECT, | 6671 | .result = REJECT, |
| 6662 | }, | 6672 | }, |
| 6663 | { | 6673 | { |
| @@ -6685,8 +6695,7 @@ static struct bpf_test tests[] = { | |||
| 6685 | BPF_EXIT_INSN(), | 6695 | BPF_EXIT_INSN(), |
| 6686 | }, | 6696 | }, |
| 6687 | .fixup_map1 = { 3 }, | 6697 | .fixup_map1 = { 3 }, |
| 6688 | .errstr_unpriv = "R0 pointer comparison prohibited", | 6698 | .errstr = "unbounded min value", |
| 6689 | .errstr = "R0 min value is negative", | ||
| 6690 | .result = REJECT, | 6699 | .result = REJECT, |
| 6691 | .result_unpriv = REJECT, | 6700 | .result_unpriv = REJECT, |
| 6692 | }, | 6701 | }, |
| @@ -6742,6 +6751,462 @@ static struct bpf_test tests[] = { | |||
| 6742 | .result = REJECT, | 6751 | .result = REJECT, |
| 6743 | }, | 6752 | }, |
| 6744 | { | 6753 | { |
| 6754 | "bounds check based on zero-extended MOV", | ||
| 6755 | .insns = { | ||
| 6756 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6757 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6758 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6759 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6760 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6761 | BPF_FUNC_map_lookup_elem), | ||
| 6762 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), | ||
| 6763 | /* r2 = 0x0000'0000'ffff'ffff */ | ||
| 6764 | BPF_MOV32_IMM(BPF_REG_2, 0xffffffff), | ||
| 6765 | /* r2 = 0 */ | ||
| 6766 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), | ||
| 6767 | /* no-op */ | ||
| 6768 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), | ||
| 6769 | /* access at offset 0 */ | ||
| 6770 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6771 | /* exit */ | ||
| 6772 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6773 | BPF_EXIT_INSN(), | ||
| 6774 | }, | ||
| 6775 | .fixup_map1 = { 3 }, | ||
| 6776 | .result = ACCEPT | ||
| 6777 | }, | ||
| 6778 | { | ||
| 6779 | "bounds check based on sign-extended MOV. test1", | ||
| 6780 | .insns = { | ||
| 6781 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6782 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6783 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6784 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6785 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6786 | BPF_FUNC_map_lookup_elem), | ||
| 6787 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), | ||
| 6788 | /* r2 = 0xffff'ffff'ffff'ffff */ | ||
| 6789 | BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), | ||
| 6790 | /* r2 = 0xffff'ffff */ | ||
| 6791 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 32), | ||
| 6792 | /* r0 = <oob pointer> */ | ||
| 6793 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), | ||
| 6794 | /* access to OOB pointer */ | ||
| 6795 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6796 | /* exit */ | ||
| 6797 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6798 | BPF_EXIT_INSN(), | ||
| 6799 | }, | ||
| 6800 | .fixup_map1 = { 3 }, | ||
| 6801 | .errstr = "map_value pointer and 4294967295", | ||
| 6802 | .result = REJECT | ||
| 6803 | }, | ||
| 6804 | { | ||
| 6805 | "bounds check based on sign-extended MOV. test2", | ||
| 6806 | .insns = { | ||
| 6807 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6808 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6809 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6810 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6811 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6812 | BPF_FUNC_map_lookup_elem), | ||
| 6813 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), | ||
| 6814 | /* r2 = 0xffff'ffff'ffff'ffff */ | ||
| 6815 | BPF_MOV64_IMM(BPF_REG_2, 0xffffffff), | ||
| 6816 | /* r2 = 0xfff'ffff */ | ||
| 6817 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_2, 36), | ||
| 6818 | /* r0 = <oob pointer> */ | ||
| 6819 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), | ||
| 6820 | /* access to OOB pointer */ | ||
| 6821 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6822 | /* exit */ | ||
| 6823 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6824 | BPF_EXIT_INSN(), | ||
| 6825 | }, | ||
| 6826 | .fixup_map1 = { 3 }, | ||
| 6827 | .errstr = "R0 min value is outside of the array range", | ||
| 6828 | .result = REJECT | ||
| 6829 | }, | ||
| 6830 | { | ||
| 6831 | "bounds check based on reg_off + var_off + insn_off. test1", | ||
| 6832 | .insns = { | ||
| 6833 | BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, | ||
| 6834 | offsetof(struct __sk_buff, mark)), | ||
| 6835 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6836 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6837 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6838 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6839 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6840 | BPF_FUNC_map_lookup_elem), | ||
| 6841 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), | ||
| 6842 | BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), | ||
| 6843 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 29) - 1), | ||
| 6844 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), | ||
| 6845 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), | ||
| 6846 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), | ||
| 6847 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6848 | BPF_EXIT_INSN(), | ||
| 6849 | }, | ||
| 6850 | .fixup_map1 = { 4 }, | ||
| 6851 | .errstr = "value_size=8 off=1073741825", | ||
| 6852 | .result = REJECT, | ||
| 6853 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | ||
| 6854 | }, | ||
| 6855 | { | ||
| 6856 | "bounds check based on reg_off + var_off + insn_off. test2", | ||
| 6857 | .insns = { | ||
| 6858 | BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, | ||
| 6859 | offsetof(struct __sk_buff, mark)), | ||
| 6860 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6861 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6862 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6863 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6864 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6865 | BPF_FUNC_map_lookup_elem), | ||
| 6866 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), | ||
| 6867 | BPF_ALU64_IMM(BPF_AND, BPF_REG_6, 1), | ||
| 6868 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, (1 << 30) - 1), | ||
| 6869 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_6), | ||
| 6870 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, (1 << 29) - 1), | ||
| 6871 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 3), | ||
| 6872 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6873 | BPF_EXIT_INSN(), | ||
| 6874 | }, | ||
| 6875 | .fixup_map1 = { 4 }, | ||
| 6876 | .errstr = "value 1073741823", | ||
| 6877 | .result = REJECT, | ||
| 6878 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | ||
| 6879 | }, | ||
| 6880 | { | ||
| 6881 | "bounds check after truncation of non-boundary-crossing range", | ||
| 6882 | .insns = { | ||
| 6883 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6884 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6885 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6886 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6887 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6888 | BPF_FUNC_map_lookup_elem), | ||
| 6889 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), | ||
| 6890 | /* r1 = [0x00, 0xff] */ | ||
| 6891 | BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 6892 | BPF_MOV64_IMM(BPF_REG_2, 1), | ||
| 6893 | /* r2 = 0x10'0000'0000 */ | ||
| 6894 | BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 36), | ||
| 6895 | /* r1 = [0x10'0000'0000, 0x10'0000'00ff] */ | ||
| 6896 | BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), | ||
| 6897 | /* r1 = [0x10'7fff'ffff, 0x10'8000'00fe] */ | ||
| 6898 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), | ||
| 6899 | /* r1 = [0x00, 0xff] */ | ||
| 6900 | BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 0x7fffffff), | ||
| 6901 | /* r1 = 0 */ | ||
| 6902 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), | ||
| 6903 | /* no-op */ | ||
| 6904 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 6905 | /* access at offset 0 */ | ||
| 6906 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6907 | /* exit */ | ||
| 6908 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6909 | BPF_EXIT_INSN(), | ||
| 6910 | }, | ||
| 6911 | .fixup_map1 = { 3 }, | ||
| 6912 | .result = ACCEPT | ||
| 6913 | }, | ||
| 6914 | { | ||
| 6915 | "bounds check after truncation of boundary-crossing range (1)", | ||
| 6916 | .insns = { | ||
| 6917 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6918 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6919 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6920 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6921 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6922 | BPF_FUNC_map_lookup_elem), | ||
| 6923 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), | ||
| 6924 | /* r1 = [0x00, 0xff] */ | ||
| 6925 | BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 6926 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6927 | /* r1 = [0xffff'ff80, 0x1'0000'007f] */ | ||
| 6928 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6929 | /* r1 = [0xffff'ff80, 0xffff'ffff] or | ||
| 6930 | * [0x0000'0000, 0x0000'007f] | ||
| 6931 | */ | ||
| 6932 | BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 0), | ||
| 6933 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6934 | /* r1 = [0x00, 0xff] or | ||
| 6935 | * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] | ||
| 6936 | */ | ||
| 6937 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6938 | /* r1 = 0 or | ||
| 6939 | * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] | ||
| 6940 | */ | ||
| 6941 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), | ||
| 6942 | /* no-op or OOB pointer computation */ | ||
| 6943 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 6944 | /* potentially OOB access */ | ||
| 6945 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6946 | /* exit */ | ||
| 6947 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6948 | BPF_EXIT_INSN(), | ||
| 6949 | }, | ||
| 6950 | .fixup_map1 = { 3 }, | ||
| 6951 | /* not actually fully unbounded, but the bound is very high */ | ||
| 6952 | .errstr = "R0 unbounded memory access", | ||
| 6953 | .result = REJECT | ||
| 6954 | }, | ||
| 6955 | { | ||
| 6956 | "bounds check after truncation of boundary-crossing range (2)", | ||
| 6957 | .insns = { | ||
| 6958 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 6959 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 6960 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 6961 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 6962 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 6963 | BPF_FUNC_map_lookup_elem), | ||
| 6964 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9), | ||
| 6965 | /* r1 = [0x00, 0xff] */ | ||
| 6966 | BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 6967 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6968 | /* r1 = [0xffff'ff80, 0x1'0000'007f] */ | ||
| 6969 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6970 | /* r1 = [0xffff'ff80, 0xffff'ffff] or | ||
| 6971 | * [0x0000'0000, 0x0000'007f] | ||
| 6972 | * difference to previous test: truncation via MOV32 | ||
| 6973 | * instead of ALU32. | ||
| 6974 | */ | ||
| 6975 | BPF_MOV32_REG(BPF_REG_1, BPF_REG_1), | ||
| 6976 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6977 | /* r1 = [0x00, 0xff] or | ||
| 6978 | * [0xffff'ffff'0000'0080, 0xffff'ffff'ffff'ffff] | ||
| 6979 | */ | ||
| 6980 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 0xffffff80 >> 1), | ||
| 6981 | /* r1 = 0 or | ||
| 6982 | * [0x00ff'ffff'ff00'0000, 0x00ff'ffff'ffff'ffff] | ||
| 6983 | */ | ||
| 6984 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), | ||
| 6985 | /* no-op or OOB pointer computation */ | ||
| 6986 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 6987 | /* potentially OOB access */ | ||
| 6988 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 6989 | /* exit */ | ||
| 6990 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 6991 | BPF_EXIT_INSN(), | ||
| 6992 | }, | ||
| 6993 | .fixup_map1 = { 3 }, | ||
| 6994 | /* not actually fully unbounded, but the bound is very high */ | ||
| 6995 | .errstr = "R0 unbounded memory access", | ||
| 6996 | .result = REJECT | ||
| 6997 | }, | ||
| 6998 | { | ||
| 6999 | "bounds check after wrapping 32-bit addition", | ||
| 7000 | .insns = { | ||
| 7001 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7002 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7003 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7004 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7005 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7006 | BPF_FUNC_map_lookup_elem), | ||
| 7007 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), | ||
| 7008 | /* r1 = 0x7fff'ffff */ | ||
| 7009 | BPF_MOV64_IMM(BPF_REG_1, 0x7fffffff), | ||
| 7010 | /* r1 = 0xffff'fffe */ | ||
| 7011 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), | ||
| 7012 | /* r1 = 0 */ | ||
| 7013 | BPF_ALU32_IMM(BPF_ADD, BPF_REG_1, 2), | ||
| 7014 | /* no-op */ | ||
| 7015 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 7016 | /* access at offset 0 */ | ||
| 7017 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 7018 | /* exit */ | ||
| 7019 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 7020 | BPF_EXIT_INSN(), | ||
| 7021 | }, | ||
| 7022 | .fixup_map1 = { 3 }, | ||
| 7023 | .result = ACCEPT | ||
| 7024 | }, | ||
| 7025 | { | ||
| 7026 | "bounds check after shift with oversized count operand", | ||
| 7027 | .insns = { | ||
| 7028 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7029 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7030 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7031 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7032 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7033 | BPF_FUNC_map_lookup_elem), | ||
| 7034 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), | ||
| 7035 | BPF_MOV64_IMM(BPF_REG_2, 32), | ||
| 7036 | BPF_MOV64_IMM(BPF_REG_1, 1), | ||
| 7037 | /* r1 = (u32)1 << (u32)32 = ? */ | ||
| 7038 | BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), | ||
| 7039 | /* r1 = [0x0000, 0xffff] */ | ||
| 7040 | BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xffff), | ||
| 7041 | /* computes unknown pointer, potentially OOB */ | ||
| 7042 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 7043 | /* potentially OOB access */ | ||
| 7044 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 7045 | /* exit */ | ||
| 7046 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 7047 | BPF_EXIT_INSN(), | ||
| 7048 | }, | ||
| 7049 | .fixup_map1 = { 3 }, | ||
| 7050 | .errstr = "R0 max value is outside of the array range", | ||
| 7051 | .result = REJECT | ||
| 7052 | }, | ||
| 7053 | { | ||
| 7054 | "bounds check after right shift of maybe-negative number", | ||
| 7055 | .insns = { | ||
| 7056 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7057 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7058 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7059 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7060 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7061 | BPF_FUNC_map_lookup_elem), | ||
| 7062 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), | ||
| 7063 | /* r1 = [0x00, 0xff] */ | ||
| 7064 | BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 7065 | /* r1 = [-0x01, 0xfe] */ | ||
| 7066 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), | ||
| 7067 | /* r1 = 0 or 0xff'ffff'ffff'ffff */ | ||
| 7068 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), | ||
| 7069 | /* r1 = 0 or 0xffff'ffff'ffff */ | ||
| 7070 | BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 8), | ||
| 7071 | /* computes unknown pointer, potentially OOB */ | ||
| 7072 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 7073 | /* potentially OOB access */ | ||
| 7074 | BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), | ||
| 7075 | /* exit */ | ||
| 7076 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 7077 | BPF_EXIT_INSN(), | ||
| 7078 | }, | ||
| 7079 | .fixup_map1 = { 3 }, | ||
| 7080 | .errstr = "R0 unbounded memory access", | ||
| 7081 | .result = REJECT | ||
| 7082 | }, | ||
| 7083 | { | ||
| 7084 | "bounds check map access with off+size signed 32bit overflow. test1", | ||
| 7085 | .insns = { | ||
| 7086 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7087 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7088 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7089 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7090 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7091 | BPF_FUNC_map_lookup_elem), | ||
| 7092 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), | ||
| 7093 | BPF_EXIT_INSN(), | ||
| 7094 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x7ffffffe), | ||
| 7095 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), | ||
| 7096 | BPF_JMP_A(0), | ||
| 7097 | BPF_EXIT_INSN(), | ||
| 7098 | }, | ||
| 7099 | .fixup_map1 = { 3 }, | ||
| 7100 | .errstr = "map_value pointer and 2147483646", | ||
| 7101 | .result = REJECT | ||
| 7102 | }, | ||
| 7103 | { | ||
| 7104 | "bounds check map access with off+size signed 32bit overflow. test2", | ||
| 7105 | .insns = { | ||
| 7106 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7107 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7108 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7109 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7110 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7111 | BPF_FUNC_map_lookup_elem), | ||
| 7112 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), | ||
| 7113 | BPF_EXIT_INSN(), | ||
| 7114 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), | ||
| 7115 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), | ||
| 7116 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 0x1fffffff), | ||
| 7117 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), | ||
| 7118 | BPF_JMP_A(0), | ||
| 7119 | BPF_EXIT_INSN(), | ||
| 7120 | }, | ||
| 7121 | .fixup_map1 = { 3 }, | ||
| 7122 | .errstr = "pointer offset 1073741822", | ||
| 7123 | .result = REJECT | ||
| 7124 | }, | ||
| 7125 | { | ||
| 7126 | "bounds check map access with off+size signed 32bit overflow. test3", | ||
| 7127 | .insns = { | ||
| 7128 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7129 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7130 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7131 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7132 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7133 | BPF_FUNC_map_lookup_elem), | ||
| 7134 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), | ||
| 7135 | BPF_EXIT_INSN(), | ||
| 7136 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), | ||
| 7137 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 0x1fffffff), | ||
| 7138 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), | ||
| 7139 | BPF_JMP_A(0), | ||
| 7140 | BPF_EXIT_INSN(), | ||
| 7141 | }, | ||
| 7142 | .fixup_map1 = { 3 }, | ||
| 7143 | .errstr = "pointer offset -1073741822", | ||
| 7144 | .result = REJECT | ||
| 7145 | }, | ||
| 7146 | { | ||
| 7147 | "bounds check map access with off+size signed 32bit overflow. test4", | ||
| 7148 | .insns = { | ||
| 7149 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7150 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7151 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7152 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7153 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7154 | BPF_FUNC_map_lookup_elem), | ||
| 7155 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), | ||
| 7156 | BPF_EXIT_INSN(), | ||
| 7157 | BPF_MOV64_IMM(BPF_REG_1, 1000000), | ||
| 7158 | BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 1000000), | ||
| 7159 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), | ||
| 7160 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 2), | ||
| 7161 | BPF_JMP_A(0), | ||
| 7162 | BPF_EXIT_INSN(), | ||
| 7163 | }, | ||
| 7164 | .fixup_map1 = { 3 }, | ||
| 7165 | .errstr = "map_value pointer and 1000000000000", | ||
| 7166 | .result = REJECT | ||
| 7167 | }, | ||
| 7168 | { | ||
| 7169 | "pointer/scalar confusion in state equality check (way 1)", | ||
| 7170 | .insns = { | ||
| 7171 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7172 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7173 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7174 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7175 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7176 | BPF_FUNC_map_lookup_elem), | ||
| 7177 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), | ||
| 7178 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), | ||
| 7179 | BPF_JMP_A(1), | ||
| 7180 | BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), | ||
| 7181 | BPF_JMP_A(0), | ||
| 7182 | BPF_EXIT_INSN(), | ||
| 7183 | }, | ||
| 7184 | .fixup_map1 = { 3 }, | ||
| 7185 | .result = ACCEPT, | ||
| 7186 | .result_unpriv = REJECT, | ||
| 7187 | .errstr_unpriv = "R0 leaks addr as return value" | ||
| 7188 | }, | ||
| 7189 | { | ||
| 7190 | "pointer/scalar confusion in state equality check (way 2)", | ||
| 7191 | .insns = { | ||
| 7192 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7193 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), | ||
| 7194 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), | ||
| 7195 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7196 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7197 | BPF_FUNC_map_lookup_elem), | ||
| 7198 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), | ||
| 7199 | BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), | ||
| 7200 | BPF_JMP_A(1), | ||
| 7201 | BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0), | ||
| 7202 | BPF_EXIT_INSN(), | ||
| 7203 | }, | ||
| 7204 | .fixup_map1 = { 3 }, | ||
| 7205 | .result = ACCEPT, | ||
| 7206 | .result_unpriv = REJECT, | ||
| 7207 | .errstr_unpriv = "R0 leaks addr as return value" | ||
| 7208 | }, | ||
| 7209 | { | ||
| 6745 | "variable-offset ctx access", | 7210 | "variable-offset ctx access", |
| 6746 | .insns = { | 7211 | .insns = { |
| 6747 | /* Get an unknown value */ | 7212 | /* Get an unknown value */ |
| @@ -6783,6 +7248,71 @@ static struct bpf_test tests[] = { | |||
| 6783 | .prog_type = BPF_PROG_TYPE_LWT_IN, | 7248 | .prog_type = BPF_PROG_TYPE_LWT_IN, |
| 6784 | }, | 7249 | }, |
| 6785 | { | 7250 | { |
| 7251 | "indirect variable-offset stack access", | ||
| 7252 | .insns = { | ||
| 7253 | /* Fill the top 8 bytes of the stack */ | ||
| 7254 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), | ||
| 7255 | /* Get an unknown value */ | ||
| 7256 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0), | ||
| 7257 | /* Make it small and 4-byte aligned */ | ||
| 7258 | BPF_ALU64_IMM(BPF_AND, BPF_REG_2, 4), | ||
| 7259 | BPF_ALU64_IMM(BPF_SUB, BPF_REG_2, 8), | ||
| 7260 | /* add it to fp. We now have either fp-4 or fp-8, but | ||
| 7261 | * we don't know which | ||
| 7262 | */ | ||
| 7263 | BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_10), | ||
| 7264 | /* dereference it indirectly */ | ||
| 7265 | BPF_LD_MAP_FD(BPF_REG_1, 0), | ||
| 7266 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
| 7267 | BPF_FUNC_map_lookup_elem), | ||
| 7268 | BPF_MOV64_IMM(BPF_REG_0, 0), | ||
| 7269 | BPF_EXIT_INSN(), | ||
| 7270 | }, | ||
| 7271 | .fixup_map1 = { 5 }, | ||
| 7272 | .errstr = "variable stack read R2", | ||
| 7273 | .result = REJECT, | ||
| 7274 | .prog_type = BPF_PROG_TYPE_LWT_IN, | ||
| 7275 | }, | ||
| 7276 | { | ||
| 7277 | "direct stack access with 32-bit wraparound. test1", | ||
| 7278 | .insns = { | ||
| 7279 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), | ||
| 7280 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), | ||
| 7281 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x7fffffff), | ||
| 7282 | BPF_MOV32_IMM(BPF_REG_0, 0), | ||
| 7283 | BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 7284 | BPF_EXIT_INSN() | ||
| 7285 | }, | ||
| 7286 | .errstr = "fp pointer and 2147483647", | ||
| 7287 | .result = REJECT | ||
| 7288 | }, | ||
| 7289 | { | ||
| 7290 | "direct stack access with 32-bit wraparound. test2", | ||
| 7291 | .insns = { | ||
| 7292 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), | ||
| 7293 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), | ||
| 7294 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x3fffffff), | ||
| 7295 | BPF_MOV32_IMM(BPF_REG_0, 0), | ||
| 7296 | BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 7297 | BPF_EXIT_INSN() | ||
| 7298 | }, | ||
| 7299 | .errstr = "fp pointer and 1073741823", | ||
| 7300 | .result = REJECT | ||
| 7301 | }, | ||
| 7302 | { | ||
| 7303 | "direct stack access with 32-bit wraparound. test3", | ||
| 7304 | .insns = { | ||
| 7305 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), | ||
| 7306 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), | ||
| 7307 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0x1fffffff), | ||
| 7308 | BPF_MOV32_IMM(BPF_REG_0, 0), | ||
| 7309 | BPF_STX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), | ||
| 7310 | BPF_EXIT_INSN() | ||
| 7311 | }, | ||
| 7312 | .errstr = "fp pointer offset 1073741822", | ||
| 7313 | .result = REJECT | ||
| 7314 | }, | ||
| 7315 | { | ||
| 6786 | "liveness pruning and write screening", | 7316 | "liveness pruning and write screening", |
| 6787 | .insns = { | 7317 | .insns = { |
| 6788 | /* Get an unknown value */ | 7318 | /* Get an unknown value */ |
| @@ -7104,6 +7634,19 @@ static struct bpf_test tests[] = { | |||
| 7104 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | 7634 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, |
| 7105 | }, | 7635 | }, |
| 7106 | { | 7636 | { |
| 7637 | "pkt_end - pkt_start is allowed", | ||
| 7638 | .insns = { | ||
| 7639 | BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, | ||
| 7640 | offsetof(struct __sk_buff, data_end)), | ||
| 7641 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | ||
| 7642 | offsetof(struct __sk_buff, data)), | ||
| 7643 | BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_2), | ||
| 7644 | BPF_EXIT_INSN(), | ||
| 7645 | }, | ||
| 7646 | .result = ACCEPT, | ||
| 7647 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | ||
| 7648 | }, | ||
| 7649 | { | ||
| 7107 | "XDP pkt read, pkt_end mangling, bad access 1", | 7650 | "XDP pkt read, pkt_end mangling, bad access 1", |
| 7108 | .insns = { | 7651 | .insns = { |
| 7109 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, | 7652 | BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, |
| @@ -7118,7 +7661,7 @@ static struct bpf_test tests[] = { | |||
| 7118 | BPF_MOV64_IMM(BPF_REG_0, 0), | 7661 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 7119 | BPF_EXIT_INSN(), | 7662 | BPF_EXIT_INSN(), |
| 7120 | }, | 7663 | }, |
| 7121 | .errstr = "R1 offset is outside of the packet", | 7664 | .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", |
| 7122 | .result = REJECT, | 7665 | .result = REJECT, |
| 7123 | .prog_type = BPF_PROG_TYPE_XDP, | 7666 | .prog_type = BPF_PROG_TYPE_XDP, |
| 7124 | }, | 7667 | }, |
| @@ -7137,7 +7680,7 @@ static struct bpf_test tests[] = { | |||
| 7137 | BPF_MOV64_IMM(BPF_REG_0, 0), | 7680 | BPF_MOV64_IMM(BPF_REG_0, 0), |
| 7138 | BPF_EXIT_INSN(), | 7681 | BPF_EXIT_INSN(), |
| 7139 | }, | 7682 | }, |
| 7140 | .errstr = "R1 offset is outside of the packet", | 7683 | .errstr = "R3 pointer arithmetic on PTR_TO_PACKET_END", |
| 7141 | .result = REJECT, | 7684 | .result = REJECT, |
| 7142 | .prog_type = BPF_PROG_TYPE_XDP, | 7685 | .prog_type = BPF_PROG_TYPE_XDP, |
| 7143 | }, | 7686 | }, |
diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config index e57b4ac40e72..7177bea1fdfa 100644 --- a/tools/testing/selftests/net/config +++ b/tools/testing/selftests/net/config | |||
| @@ -1,3 +1,4 @@ | |||
| 1 | CONFIG_USER_NS=y | 1 | CONFIG_USER_NS=y |
| 2 | CONFIG_BPF_SYSCALL=y | 2 | CONFIG_BPF_SYSCALL=y |
| 3 | CONFIG_TEST_BPF=m | 3 | CONFIG_TEST_BPF=m |
| 4 | CONFIG_NUMA=y | ||
