lkml.org 
[lkml]   [2021]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 115/172] libbpf: Fix segfault in static linker for objects without BTF
    Date
    From: Kumar Kartikeya Dwivedi <memxor@gmail.com>

    [ Upstream commit bcfd367c2839f2126c048fe59700ec1b538e2b06 ]

    When a BPF object is compiled without BTF info (without -g),
    trying to link such objects using bpftool causes a SIGSEGV due to
    btf__get_nr_types accessing obj->btf which is NULL. Fix this by
    checking for the NULL pointer, and return error.

    Reproducer:
    $ cat a.bpf.c
    extern int foo(void);
    int bar(void) { return foo(); }
    $ cat b.bpf.c
    int foo(void) { return 0; }
    $ clang -O2 -target bpf -c a.bpf.c
    $ clang -O2 -target bpf -c b.bpf.c
    $ bpftool gen obj out a.bpf.o b.bpf.o
    Segmentation fault (core dumped)

    After fix:
    $ bpftool gen obj out a.bpf.o b.bpf.o
    libbpf: failed to find BTF info for object 'a.bpf.o'
    Error: failed to link 'a.bpf.o': Unknown error -22 (-22)

    Fixes: a46349227cd8 (libbpf: Add linker extern resolution support for functions and global variables)
    Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
    Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
    Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20210924023725.70228-1-memxor@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/lib/bpf/linker.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c
    index 10911a8cad0f..2df880cefdae 100644
    --- a/tools/lib/bpf/linker.c
    +++ b/tools/lib/bpf/linker.c
    @@ -1649,11 +1649,17 @@ static bool btf_is_non_static(const struct btf_type *t)
    static int find_glob_sym_btf(struct src_obj *obj, Elf64_Sym *sym, const char *sym_name,
    int *out_btf_sec_id, int *out_btf_id)
    {
    - int i, j, n = btf__get_nr_types(obj->btf), m, btf_id = 0;
    + int i, j, n, m, btf_id = 0;
    const struct btf_type *t;
    const struct btf_var_secinfo *vi;
    const char *name;

    + if (!obj->btf) {
    + pr_warn("failed to find BTF info for object '%s'\n", obj->filename);
    + return -EINVAL;
    + }
    +
    + n = btf__get_nr_types(obj->btf);
    for (i = 1; i <= n; i++) {
    t = btf__type_by_id(obj->btf, i);

    --
    2.33.0


    \
     
     \ /
      Last update: 2021-10-04 15:39    [W:2.125 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site