• Alexei Starovoitov's avatar
    bpf: x86: fix epilogue generation for eBPF programs · 769e0de6
    Alexei Starovoitov authored
    classic BPF has a restriction that last insn is always BPF_RET.
    eBPF doesn't have BPF_RET instruction and this restriction.
    It has BPF_EXIT insn which can appear anywhere in the program
    one or more times and it doesn't have to be last insn.
    Fix eBPF JIT to emit epilogue when first BPF_EXIT is seen
    and all other BPF_EXIT instructions will be emitted as jump.
    
    Since jump offset to epilogue is computed as:
    jmp_offset = ctx->cleanup_addr - addrs[i]
    we need to change type of cleanup_addr to signed to compute the offset as:
    (long long) ((int)20 - (int)30)
    instead of:
    (long long) ((unsigned int)20 - (int)30)
    
    Fixes: 62258278 ("net: filter: x86: internal BPF JIT")
    Signed-off-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    769e0de6
bpf_jit_comp.c 25.8 KB