Extend test_verifier with various test cases around the two kernel
extensions, that is, {rd,wr}only map support as well as direct map
value access. All passing, one skipped due to xskmap not present
on test machine:

  # ./test_verifier
  [...]
  #920/p XDP pkt read, pkt_data <= pkt_meta', bad access 1 OK
  #921/p XDP pkt read, pkt_data <= pkt_meta', bad access 2 OK
  Summary: 1366 PASSED, 1 SKIPPED, 0 FAILED

Signed-off-by: Daniel Borkmann <dan...@iogearbox.net>
---
 tools/include/linux/filter.h                  |  14 ++
 tools/testing/selftests/bpf/test_verifier.c   |  42 +++-
 .../selftests/bpf/verifier/array_access.c     | 159 ++++++++++++
 .../bpf/verifier/direct_value_access.c        | 226 ++++++++++++++++++
 4 files changed, 436 insertions(+), 5 deletions(-)
 create mode 100644 tools/testing/selftests/bpf/verifier/direct_value_access.c

diff --git a/tools/include/linux/filter.h b/tools/include/linux/filter.h
index cce0b02c0e28..d288576e0bcd 100644
--- a/tools/include/linux/filter.h
+++ b/tools/include/linux/filter.h
@@ -283,6 +283,20 @@
 #define BPF_LD_MAP_FD(DST, MAP_FD)                             \
        BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD)
 
+#define BPF_LD_MAP_VALUE(DST, MAP_FD, VALUE_IDX, VALUE_OFF)    \
+       ((struct bpf_insn) {                                    \
+               .code  = BPF_LD | BPF_DW | BPF_IMM,             \
+               .dst_reg = DST,                                 \
+               .src_reg = BPF_PSEUDO_MAP_VALUE,                \
+               .off   = (__u16)(VALUE_IDX),                    \
+               .imm   = MAP_FD }),                             \
+       ((struct bpf_insn) {                                    \
+               .code  = 0, /* zero is reserved opcode */       \
+               .dst_reg = 0,                                   \
+               .src_reg = 0,                                   \
+               .off   = ((__u32)(VALUE_IDX)) >> 16,            \
+               .imm   = VALUE_OFF })
+
 /* Relative call */
 
 #define BPF_CALL_REL(TGT)                                      \
diff --git a/tools/testing/selftests/bpf/test_verifier.c 
b/tools/testing/selftests/bpf/test_verifier.c
index 477a9dcf9fff..7ef1991a5295 100644
--- a/tools/testing/selftests/bpf/test_verifier.c
+++ b/tools/testing/selftests/bpf/test_verifier.c
@@ -51,7 +51,7 @@
 
 #define MAX_INSNS      BPF_MAXINSNS
 #define MAX_FIXUPS     8
-#define MAX_NR_MAPS    14
+#define MAX_NR_MAPS    16
 #define MAX_TEST_RUNS  8
 #define POINTER_VALUE  0xcafe4all
 #define TEST_DATA_LEN  64
@@ -80,6 +80,8 @@ struct bpf_test {
        int fixup_cgroup_storage[MAX_FIXUPS];
        int fixup_percpu_cgroup_storage[MAX_FIXUPS];
        int fixup_map_spin_lock[MAX_FIXUPS];
+       int fixup_map_array_ro[MAX_FIXUPS];
+       int fixup_map_array_wo[MAX_FIXUPS];
        const char *errstr;
        const char *errstr_unpriv;
        uint32_t retval, retval_unpriv, insn_processed;
@@ -277,13 +279,15 @@ static bool skip_unsupported_map(enum bpf_map_type 
map_type)
        return false;
 }
 
-static int create_map(uint32_t type, uint32_t size_key,
-                     uint32_t size_value, uint32_t max_elem)
+static int __create_map(uint32_t type, uint32_t size_key,
+                       uint32_t size_value, uint32_t max_elem,
+                       uint32_t extra_flags)
 {
        int fd;
 
        fd = bpf_create_map(type, size_key, size_value, max_elem,
-                           type == BPF_MAP_TYPE_HASH ? BPF_F_NO_PREALLOC : 0);
+                           (type == BPF_MAP_TYPE_HASH ?
+                            BPF_F_NO_PREALLOC : 0) | extra_flags);
        if (fd < 0) {
                if (skip_unsupported_map(type))
                        return -1;
@@ -293,6 +297,12 @@ static int create_map(uint32_t type, uint32_t size_key,
        return fd;
 }
 
+static int create_map(uint32_t type, uint32_t size_key,
+                     uint32_t size_value, uint32_t max_elem)
+{
+       return __create_map(type, size_key, size_value, max_elem, 0);
+}
+
 static void update_map(int fd, int index)
 {
        struct test_val value = {
@@ -519,6 +529,8 @@ static void do_test_fixup(struct bpf_test *test, enum 
bpf_prog_type prog_type,
        int *fixup_cgroup_storage = test->fixup_cgroup_storage;
        int *fixup_percpu_cgroup_storage = test->fixup_percpu_cgroup_storage;
        int *fixup_map_spin_lock = test->fixup_map_spin_lock;
+       int *fixup_map_array_ro = test->fixup_map_array_ro;
+       int *fixup_map_array_wo = test->fixup_map_array_wo;
 
        if (test->fill_helper)
                test->fill_helper(test);
@@ -556,7 +568,7 @@ static void do_test_fixup(struct bpf_test *test, enum 
bpf_prog_type prog_type,
 
        if (*fixup_map_array_48b) {
                map_fds[3] = create_map(BPF_MAP_TYPE_ARRAY, sizeof(int),
-                                       sizeof(struct test_val), 1);
+                                       sizeof(struct test_val), 2);
                update_map(map_fds[3], 0);
                do {
                        prog[*fixup_map_array_48b].imm = map_fds[3];
@@ -642,6 +654,26 @@ static void do_test_fixup(struct bpf_test *test, enum 
bpf_prog_type prog_type,
                        fixup_map_spin_lock++;
                } while (*fixup_map_spin_lock);
        }
+       if (*fixup_map_array_ro) {
+               map_fds[14] = __create_map(BPF_MAP_TYPE_ARRAY, sizeof(int),
+                                          sizeof(struct test_val), 1,
+                                          BPF_F_RDONLY_PROG);
+               update_map(map_fds[14], 0);
+               do {
+                       prog[*fixup_map_array_ro].imm = map_fds[14];
+                       fixup_map_array_ro++;
+               } while (*fixup_map_array_ro);
+       }
+       if (*fixup_map_array_wo) {
+               map_fds[15] = __create_map(BPF_MAP_TYPE_ARRAY, sizeof(int),
+                                          sizeof(struct test_val), 1,
+                                          BPF_F_WRONLY_PROG);
+               update_map(map_fds[15], 0);
+               do {
+                       prog[*fixup_map_array_wo].imm = map_fds[15];
+                       fixup_map_array_wo++;
+               } while (*fixup_map_array_wo);
+       }
 }
 
 static int set_admin(bool admin)
diff --git a/tools/testing/selftests/bpf/verifier/array_access.c 
b/tools/testing/selftests/bpf/verifier/array_access.c
index 0dcecaf3ec6f..9a2b6f9b4414 100644
--- a/tools/testing/selftests/bpf/verifier/array_access.c
+++ b/tools/testing/selftests/bpf/verifier/array_access.c
@@ -217,3 +217,162 @@
        .result = REJECT,
        .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
 },
+{
+       "valid read map access into a read-only array 1",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
+       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_ro = { 3 },
+       .result = ACCEPT,
+       .retval = 28,
+},
+{
+       "valid read map access into a read-only array 2",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
+
+       BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
+       BPF_MOV64_IMM(BPF_REG_2, 4),
+       BPF_MOV64_IMM(BPF_REG_3, 0),
+       BPF_MOV64_IMM(BPF_REG_4, 0),
+       BPF_MOV64_IMM(BPF_REG_5, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
+                    BPF_FUNC_csum_diff),
+       BPF_EXIT_INSN(),
+       },
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+       .fixup_map_array_ro = { 3 },
+       .result = ACCEPT,
+       .retval = -29,
+},
+{
+       "invalid write map access into a read-only array 1",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_ro = { 3 },
+       .result = REJECT,
+       .errstr = "write into map forbidden",
+},
+{
+       "invalid write map access into a read-only array 2",
+       .insns = {
+       BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
+       BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
+       BPF_MOV64_IMM(BPF_REG_2, 0),
+       BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
+       BPF_MOV64_IMM(BPF_REG_4, 8),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
+                    BPF_FUNC_skb_load_bytes),
+       BPF_EXIT_INSN(),
+       },
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+       .fixup_map_array_ro = { 4 },
+       .result = REJECT,
+       .errstr = "write into map forbidden",
+},
+{
+       "valid write map access into a write-only array 1",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_wo = { 3 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "valid write map access into a write-only array 2",
+       .insns = {
+       BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5),
+       BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
+       BPF_MOV64_IMM(BPF_REG_2, 0),
+       BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
+       BPF_MOV64_IMM(BPF_REG_4, 8),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
+                    BPF_FUNC_skb_load_bytes),
+       BPF_EXIT_INSN(),
+       },
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+       .fixup_map_array_wo = { 4 },
+       .result = ACCEPT,
+       .retval = 0,
+},
+{
+       "invalid read map access into a write-only array 1",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
+       BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_wo = { 3 },
+       .result = REJECT,
+       .errstr = "read into map forbidden",
+},
+{
+       "invalid read map access into a write-only array 2",
+       .insns = {
+       BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
+       BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
+       BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
+       BPF_LD_MAP_FD(BPF_REG_1, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
+       BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6),
+
+       BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
+       BPF_MOV64_IMM(BPF_REG_2, 4),
+       BPF_MOV64_IMM(BPF_REG_3, 0),
+       BPF_MOV64_IMM(BPF_REG_4, 0),
+       BPF_MOV64_IMM(BPF_REG_5, 0),
+       BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
+                    BPF_FUNC_csum_diff),
+       BPF_EXIT_INSN(),
+       },
+       .prog_type = BPF_PROG_TYPE_SCHED_CLS,
+       .fixup_map_array_wo = { 3 },
+       .result = REJECT,
+       .errstr = "read into map forbidden",
+},
diff --git a/tools/testing/selftests/bpf/verifier/direct_value_access.c 
b/tools/testing/selftests/bpf/verifier/direct_value_access.c
new file mode 100644
index 000000000000..656c3675b735
--- /dev/null
+++ b/tools/testing/selftests/bpf/verifier/direct_value_access.c
@@ -0,0 +1,226 @@
+{
+       "direct map access, write test 1",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 0),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 2",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 8),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 3",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 8),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 4",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 40),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 5",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 32),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 8, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 6",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 40),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 4, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "R1 min value is outside of the array range",
+},
+{
+       "direct map access, write test 7",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, -1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 4, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "direct value offset of 4294967295 is not allowed",
+},
+{
+       "direct map access, write test 8",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 1),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, -1, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 9",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 48),
+       BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 4242),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "invalid access to map value pointer",
+},
+{
+       "direct map access, write test 10",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 47),
+       BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 4),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = ACCEPT,
+       .retval = 1,
+},
+{
+       "direct map access, write test 11",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 48),
+       BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 4),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "invalid access to map value pointer",
+},
+{
+       "direct map access, write test 12",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, (1<<29)),
+       BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 4),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "direct value offset of 536870912 is not allowed",
+},
+{
+       "direct map access, write test 13",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, (1<<29)-1),
+       BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 4),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1 },
+       .result = REJECT,
+       .errstr = "invalid access to map value pointer, value_size=48 index=0 
off=536870911",
+},
+{
+       "direct map access, write test 14",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 0, 47),
+       BPF_LD_MAP_VALUE(BPF_REG_2, 0, 0, 46),
+       BPF_ST_MEM(BPF_H, BPF_REG_2, 0, 0xffff),
+       BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1, 3 },
+       .result = ACCEPT,
+       .retval = 0xff,
+},
+{
+       "direct map access, write test 15",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 1, 47),
+       BPF_LD_MAP_VALUE(BPF_REG_2, 0, 1, 46),
+       BPF_ST_MEM(BPF_H, BPF_REG_2, 0, 0xffff),
+       BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1, 3 },
+       .result = ACCEPT,
+       .retval = 0xff,
+},
+{
+       "direct map access, write test 16",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 1, 46),
+       BPF_LD_MAP_VALUE(BPF_REG_2, 0, 0, 46),
+       BPF_ST_MEM(BPF_H, BPF_REG_2, 0, 0xffff),
+       BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1, 3 },
+       .result = ACCEPT,
+       .retval = 0,
+},
+{
+       "direct map access, write test 17",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, 1, 46),
+       BPF_LD_MAP_VALUE(BPF_REG_2, 0, 2, 46),
+       BPF_ST_MEM(BPF_H, BPF_REG_2, 0, 0xffff),
+       BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1, 3 },
+       .result = REJECT,
+       .errstr = "invalid access to map value pointer, value_size=48 index=2 
off=46",
+},
+{
+       "direct map access, write test 18",
+       .insns = {
+       BPF_MOV64_IMM(BPF_REG_0, 1),
+       BPF_LD_MAP_VALUE(BPF_REG_1, 0, ~0, 46),
+       BPF_LD_MAP_VALUE(BPF_REG_2, 0, ~0, 46),
+       BPF_ST_MEM(BPF_H, BPF_REG_2, 0, 0xffff),
+       BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1, 0),
+       BPF_EXIT_INSN(),
+       },
+       .fixup_map_array_48b = { 1, 3 },
+       .result = REJECT,
+       .errstr = "invalid access to map value pointer, value_size=48 
index=4294967295 off=46",
+},
-- 
2.17.1

Reply via email to