• Song Liu's avatar
    bpf, x86: fix freeing of not-finalized bpf_prog_pack · 1d5f82d9
    Song Liu authored
    syzbot reported a few issues with bpf_prog_pack [1], [2]. This only happens
    with multiple subprogs. In jit_subprogs(), we first call bpf_int_jit_compile()
    on each sub program. And then, we call it on each sub program again. jit_data
    is not freed in the first call of bpf_int_jit_compile(). Similarly we don't
    call bpf_jit_binary_pack_finalize() in the first call of bpf_int_jit_compile().
    
    If bpf_int_jit_compile() failed for one sub program, we will call
    bpf_jit_binary_pack_finalize() for this sub program. However, we don't have a
    chance to call it for other sub programs. Then we will hit "goto out_free" in
    jit_subprogs(), and call bpf_jit_free on some subprograms that haven't got
    bpf_jit_binary_pack_finalize() yet.
    
    At this point, bpf_jit_binary_pack_free() is called and the whole 2MB page is
    freed erroneously.
    
    Fix this with a custom bpf_jit_free() for x86_64, which calls
    bpf_jit_binary_pack_finalize() if necessary. Also, with custom
    bpf_jit_free(), bpf_prog_aux->use_bpf_prog_pack is not needed any more,
    remove it.
    
    Fixes: 1022a549 ("bpf, x86_64: Use bpf_jit_binary_pack_alloc")
    [1] https://syzkaller.appspot.com/bug?extid=2f649ec6d2eea1495a8f
    [2] https://syzkaller.appspot.com/bug?extid=87f65c75f4a72db05445
    Reported-by: syzbot+2f649ec6d2eea1495a8f@syzkaller.appspotmail.com
    Reported-by: syzbot+87f65c75f4a72db05445@syzkaller.appspotmail.com
    Signed-off-by: default avatarSong Liu <song@kernel.org>
    Link: https://lore.kernel.org/r/20220706002612.4013790-1-song@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    1d5f82d9
core.c 71.6 KB