Commit 36aa9a82 authored by Ben Hutchings's avatar Ben Hutchings Committed by Juerg Haefliger

bpf/verifier: Pass instruction index to check_mem_access() and check_xadd()

BugLink: https://bugs.launchpad.net/bugs/1811080

Extracted from commit 31fd8581 "bpf: permits narrower load from
bpf program context fields".

Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarBen Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
parent 8ce36463
...@@ -710,7 +710,7 @@ static bool is_ctx_reg(struct verifier_env *env, int regno) ...@@ -710,7 +710,7 @@ static bool is_ctx_reg(struct verifier_env *env, int regno)
* if t==write && value_regno==-1, some unknown value is stored into memory * if t==write && value_regno==-1, some unknown value is stored into memory
* if t==read && value_regno==-1, don't care what we read from memory * if t==read && value_regno==-1, don't care what we read from memory
*/ */
static int check_mem_access(struct verifier_env *env, u32 regno, int off, static int check_mem_access(struct verifier_env *env, int insn_idx, u32 regno, int off,
int bpf_size, enum bpf_access_type t, int bpf_size, enum bpf_access_type t,
int value_regno) int value_regno)
{ {
...@@ -774,7 +774,7 @@ static int check_mem_access(struct verifier_env *env, u32 regno, int off, ...@@ -774,7 +774,7 @@ static int check_mem_access(struct verifier_env *env, u32 regno, int off,
return err; return err;
} }
static int check_xadd(struct verifier_env *env, struct bpf_insn *insn) static int check_xadd(struct verifier_env *env, int insn_idx, struct bpf_insn *insn)
{ {
struct reg_state *regs = env->cur_state.regs; struct reg_state *regs = env->cur_state.regs;
int err; int err;
...@@ -807,13 +807,13 @@ static int check_xadd(struct verifier_env *env, struct bpf_insn *insn) ...@@ -807,13 +807,13 @@ static int check_xadd(struct verifier_env *env, struct bpf_insn *insn)
} }
/* check whether atomic_add can read the memory */ /* check whether atomic_add can read the memory */
err = check_mem_access(env, insn->dst_reg, insn->off, err = check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
BPF_SIZE(insn->code), BPF_READ, -1); BPF_SIZE(insn->code), BPF_READ, -1);
if (err) if (err)
return err; return err;
/* check whether atomic_add can write into the same memory */ /* check whether atomic_add can write into the same memory */
return check_mem_access(env, insn->dst_reg, insn->off, return check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
BPF_SIZE(insn->code), BPF_WRITE, -1); BPF_SIZE(insn->code), BPF_WRITE, -1);
} }
...@@ -1868,7 +1868,7 @@ static int do_check(struct verifier_env *env) ...@@ -1868,7 +1868,7 @@ static int do_check(struct verifier_env *env)
/* check that memory (src_reg + off) is readable, /* check that memory (src_reg + off) is readable,
* the state of dst_reg will be updated by this func * the state of dst_reg will be updated by this func
*/ */
err = check_mem_access(env, insn->src_reg, insn->off, err = check_mem_access(env, insn_idx, insn->src_reg, insn->off,
BPF_SIZE(insn->code), BPF_READ, BPF_SIZE(insn->code), BPF_READ,
insn->dst_reg); insn->dst_reg);
if (err) if (err)
...@@ -1907,7 +1907,7 @@ static int do_check(struct verifier_env *env) ...@@ -1907,7 +1907,7 @@ static int do_check(struct verifier_env *env)
enum bpf_reg_type *prev_dst_type, dst_reg_type; enum bpf_reg_type *prev_dst_type, dst_reg_type;
if (BPF_MODE(insn->code) == BPF_XADD) { if (BPF_MODE(insn->code) == BPF_XADD) {
err = check_xadd(env, insn); err = check_xadd(env, insn_idx, insn);
if (err) if (err)
return err; return err;
insn_idx++; insn_idx++;
...@@ -1926,7 +1926,7 @@ static int do_check(struct verifier_env *env) ...@@ -1926,7 +1926,7 @@ static int do_check(struct verifier_env *env)
dst_reg_type = regs[insn->dst_reg].type; dst_reg_type = regs[insn->dst_reg].type;
/* check that memory (dst_reg + off) is writeable */ /* check that memory (dst_reg + off) is writeable */
err = check_mem_access(env, insn->dst_reg, insn->off, err = check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
BPF_SIZE(insn->code), BPF_WRITE, BPF_SIZE(insn->code), BPF_WRITE,
insn->src_reg); insn->src_reg);
if (err) if (err)
...@@ -1961,7 +1961,7 @@ static int do_check(struct verifier_env *env) ...@@ -1961,7 +1961,7 @@ static int do_check(struct verifier_env *env)
} }
/* check that memory (dst_reg + off) is writeable */ /* check that memory (dst_reg + off) is writeable */
err = check_mem_access(env, insn->dst_reg, insn->off, err = check_mem_access(env, insn_idx, insn->dst_reg, insn->off,
BPF_SIZE(insn->code), BPF_WRITE, BPF_SIZE(insn->code), BPF_WRITE,
-1); -1);
if (err) if (err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment