lkml.org 
[lkml]   [2018]   [Dec]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 64/88] bpf/verifier: Pass instruction index to check_mem_access() and check_xadd()
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ben Hutchings <ben.hutchings@codethink.co.uk>

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

    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/bpf/verifier.c | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    --- a/kernel/bpf/verifier.c
    +++ b/kernel/bpf/verifier.c
    @@ -694,7 +694,7 @@ static bool is_ctx_reg(struct verifier_e
    * 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
    */
    -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 value_regno)
    {
    @@ -758,7 +758,7 @@ static int check_mem_access(struct verif
    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;
    int err;
    @@ -791,13 +791,13 @@ static int check_xadd(struct verifier_en
    }

    /* 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);
    if (err)
    return err;

    /* 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);
    }

    @@ -1836,7 +1836,7 @@ static int do_check(struct verifier_env
    /* check that memory (src_reg + off) is readable,
    * 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,
    insn->dst_reg);
    if (err)
    @@ -1875,7 +1875,7 @@ static int do_check(struct verifier_env
    enum bpf_reg_type *prev_dst_type, dst_reg_type;

    if (BPF_MODE(insn->code) == BPF_XADD) {
    - err = check_xadd(env, insn);
    + err = check_xadd(env, insn_idx, insn);
    if (err)
    return err;
    insn_idx++;
    @@ -1894,7 +1894,7 @@ static int do_check(struct verifier_env
    dst_reg_type = regs[insn->dst_reg].type;

    /* 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,
    insn->src_reg);
    if (err)
    @@ -1929,7 +1929,7 @@ static int do_check(struct verifier_env
    }

    /* 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,
    -1);
    if (err)

    \
     
     \ /
      Last update: 2018-12-14 13:20    [W:4.588 / U:0.372 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site