• Toshiaki Makita's avatar
    bpf, devmap: Fix premature entry free on destroying map · 92e9431c
    Toshiaki Makita authored
    [ Upstream commit d4dd153d ]
    
    dev_map_free() waits for flush_needed bitmap to be empty in order to
    ensure all flush operations have completed before freeing its entries.
    However the corresponding clear_bit() was called before using the
    entries, so the entries could be used after free.
    
    All access to the entries needs to be done before clearing the bit.
    It seems commit a5e2da6e ("bpf: netdev is never null in
    __dev_map_flush") accidentally changed the clear_bit() and memory access
    order.
    
    Note that the problem happens only in __dev_map_flush(), not in
    dev_map_flush_old(). dev_map_flush_old() is called only after nulling
    out the corresponding netdev_map entry, so dev_map_free() never frees
    the entry thus no such race happens there.
    
    Fixes: a5e2da6e ("bpf: netdev is never null in __dev_map_flush")
    Signed-off-by: default avatarToshiaki Makita <toshiaki.makita1@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    92e9431c
devmap.c 15.4 KB