• Eric Leblond's avatar
    tools lib bpf: Fix maps resolution · 4708bbda
    Eric Leblond authored
    It is not correct to assimilate the elf data of the maps section to an
    array of map definition. In fact the sizes differ. The offset provided
    in the symbol section has to be used instead.
    
    This patch fixes a bug causing a elf with two maps not to load
    correctly.
    
    Wang Nan added:
    
    This patch requires a name for each BPF map, so array of BPF maps is not
    allowed. This restriction is reasonable, because kernel verifier forbid
    indexing BPF map from such array unless the index is a fixed value, but
    if the index is fixed why not merging it into name?
    
    For example:
    
    Program like this:
      ...
      unsigned long cpu = get_smp_processor_id();
      int *pval = map_lookup_elem(&map_array[cpu], &key);
      ...
    
    Generates bytecode like this:
    
    0: (b7) r1 = 0
    1: (63) *(u32 *)(r10 -4) = r1
    2: (b7) r1 = 680997
    3: (63) *(u32 *)(r10 -8) = r1
    4: (85) call 8
    5: (67) r0 <<= 4
    6: (18) r1 = 0x112dd000
    8: (0f) r0 += r1
    9: (bf) r2 = r10
    10: (07) r2 += -4
    11: (bf) r1 = r0
    12: (85) call 1
    
    Where instruction 8 is the computation, 8 and 11 render r1 to an invalid
    value for function map_lookup_elem, causes verifier report error.
    Signed-off-by: default avatarEric Leblond <eric@regit.org>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Wang Nan <wangnan0@huawei.com>
    [ Merge bpf_object__init_maps_name into bpf_object__init_maps.
      Fix segfault for buggy BPF script Validate obj->maps ]
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/20161115040617.69788-5-wangnan0@huawei.comSigned-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    4708bbda
libbpf.c 32.8 KB