• Antoine Tenart's avatar
    net: do not reuse skbuff allocated from skbuff_fclone_cache in the skb cache · 28b34f01
    Antoine Tenart authored
    Some socket buffers allocated in the fclone cache (in __alloc_skb) can
    end-up in the following path[1]:
    
    napi_skb_finish
      __kfree_skb_defer
        napi_skb_cache_put
    
    The issue is napi_skb_cache_put is not fclone friendly and will put
    those skbuff in the skb cache to be reused later, although this cache
    only expects skbuff allocated from skbuff_head_cache. When this happens
    the skbuff is eventually freed using the wrong origin cache, and we can
    see traces similar to:
    
    [ 1223.947534] cache_from_obj: Wrong slab cache. skbuff_head_cache but object is from skbuff_fclone_cache
    [ 1223.948895] WARNING: CPU: 3 PID: 0 at mm/slab.h:442 kmem_cache_free+0x251/0x3e0
    [ 1223.950211] Modules linked in:
    [ 1223.950680] CPU: 3 PID: 0 Comm: swapper/3 Not tainted 5.13.0+ #474
    [ 1223.951587] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-3.fc34 04/01/2014
    [ 1223.953060] RIP: 0010:kmem_cache_free+0x251/0x3e0
    
    Leading sometimes to other memory related issues.
    
    Fix this by using __kfree_skb for fclone skbuff, similar to what is done
    the other place __kfree_skb_defer is called.
    
    [1] At least in setups using veth pairs and tunnels. Building a kernel
        with KASAN we can for example see packets allocated in
        sk_stream_alloc_skb hit the above path and later the issue arises
        when the skbuff is reused.
    
    Fixes: 9243adfc ("skbuff: queue NAPI_MERGED_FREE skbs into NAPI cache instead of freeing")
    Cc: Alexander Lobakin <alobakin@pm.me>
    Signed-off-by: default avatarAntoine Tenart <atenart@kernel.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    28b34f01
dev.c 291 KB