• J
    bpf: sockmap, fix smap_list_map_remove when psock is in many maps · 54fedb42
    John Fastabend 提交于
    If a hashmap is free'd with open socks it removes the reference to
    the hash entry from the psock. If that is the last reference to the
    psock then it will also be free'd by the reference counting logic.
    However the current logic that removes the hash reference from the
    list of references is broken. In smap_list_remove() we first check
    if the sockmap entry matches and then check if the hashmap entry
    matches. But, the sockmap entry sill always match because its NULL in
    this case which causes the first entry to be removed from the list.
    If this is always the "right" entry (because the user adds/removes
    entries in order) then everything is OK but otherwise a subsequent
    bpf_tcp_close() may reference a free'd object.
    
    To fix this create two list handlers one for sockmap and one for
    sockhash.
    
    Reported-by: syzbot+0ce137753c78f7b6acc1@syzkaller.appspotmail.com
    Fixes: 81110384 ("bpf: sockmap, add hash map support")
    Acked-by: NMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: NJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
    54fedb42
sockmap.c 57.9 KB