• Daniel Borkmann's avatar
    bpf: fix map value attribute for hash of maps · cd36c3a2
    Daniel Borkmann authored
    Currently, iproute2's BPF ELF loader works fine with array of maps
    when retrieving the fd from a pinned node and doing a selfcheck
    against the provided map attributes from the object file, but we
    fail to do the same for hash of maps and thus refuse to get the
    map from pinned node.
    
    Reason is that when allocating hash of maps, fd_htab_map_alloc() will
    set the value size to sizeof(void *), and any user space map creation
    requests are forced to set 4 bytes as value size. Thus, selfcheck
    will complain about exposed 8 bytes on 64 bit archs vs. 4 bytes from
    object file as value size. Contract is that fdinfo or BPF_MAP_GET_FD_BY_ID
    returns the value size used to create the map.
    
    Fix it by handling it the same way as we do for array of maps, which
    means that we leave value size at 4 bytes and in the allocation phase
    round up value size to 8 bytes. alloc_htab_elem() needs an adjustment
    in order to copy rounded up 8 bytes due to bpf_fd_htab_map_update_elem()
    calling into htab_map_update_elem() with the pointer of the map
    pointer as value. Unlike array of maps where we just xchg(), we're
    using the generic htab_map_update_elem() callback also used from helper
    calls, which published the key/value already on return, so we need
    to ensure to memcpy() the right size.
    
    Fixes: bcc6b1b7 ("bpf: Add hash of maps support")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cd36c3a2
hashtab.c 33.6 KB