lkml.org 
[lkml]   [2020]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.7 388/388] bpf: Undo internal BPF_PROBE_MEM in BPF insns dump
    Date
    From: Andrii Nakryiko <andriin@fb.com>

    [ Upstream commit 29fcb05bbf1a7008900bb9bee347bdbfc7171036 ]

    BPF_PROBE_MEM is kernel-internal implmementation details. When dumping BPF
    instructions to user-space, it needs to be replaced back with BPF_MEM mode.

    Fixes: 2a02759ef5f8 ("bpf: Add support for BTF pointers to interpreter")
    Signed-off-by: Andrii Nakryiko <andriin@fb.com>
    Signed-off-by: Alexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200613002115.1632142-1-andriin@fb.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/bpf/syscall.c | 17 ++++++++++++-----
    1 file changed, 12 insertions(+), 5 deletions(-)

    diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
    index 4e6dee19a668..5d1d24f56d53 100644
    --- a/kernel/bpf/syscall.c
    +++ b/kernel/bpf/syscall.c
    @@ -2923,6 +2923,7 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog)
    struct bpf_insn *insns;
    u32 off, type;
    u64 imm;
    + u8 code;
    int i;

    insns = kmemdup(prog->insnsi, bpf_prog_insn_size(prog),
    @@ -2931,21 +2932,27 @@ static struct bpf_insn *bpf_insn_prepare_dump(const struct bpf_prog *prog)
    return insns;

    for (i = 0; i < prog->len; i++) {
    - if (insns[i].code == (BPF_JMP | BPF_TAIL_CALL)) {
    + code = insns[i].code;
    +
    + if (code == (BPF_JMP | BPF_TAIL_CALL)) {
    insns[i].code = BPF_JMP | BPF_CALL;
    insns[i].imm = BPF_FUNC_tail_call;
    /* fall-through */
    }
    - if (insns[i].code == (BPF_JMP | BPF_CALL) ||
    - insns[i].code == (BPF_JMP | BPF_CALL_ARGS)) {
    - if (insns[i].code == (BPF_JMP | BPF_CALL_ARGS))
    + if (code == (BPF_JMP | BPF_CALL) ||
    + code == (BPF_JMP | BPF_CALL_ARGS)) {
    + if (code == (BPF_JMP | BPF_CALL_ARGS))
    insns[i].code = BPF_JMP | BPF_CALL;
    if (!bpf_dump_raw_ok())
    insns[i].imm = 0;
    continue;
    }
    + if (BPF_CLASS(code) == BPF_LDX && BPF_MODE(code) == BPF_PROBE_MEM) {
    + insns[i].code = BPF_LDX | BPF_SIZE(code) | BPF_MEM;
    + continue;
    + }

    - if (insns[i].code != (BPF_LD | BPF_IMM | BPF_DW))
    + if (code != (BPF_LD | BPF_IMM | BPF_DW))
    continue;

    imm = ((u64)insns[i + 1].imm << 32) | (u32)insns[i].imm;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-18 03:20    [W:3.550 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site