• Willem de Bruijn's avatar
    skbuff: in skb_copy_ubufs unclone before releasing zerocopy · f72c4ac6
    Willem de Bruijn authored
    skb_copy_ubufs must unclone before it is safe to modify its
    skb_shared_info with skb_zcopy_clear.
    
    Commit b90ddd56 ("skbuff: skb_copy_ubufs must release uarg even
    without user frags") ensures that all skbs release their zerocopy
    state, even those without frags.
    
    But I forgot an edge case where such an skb arrives that is cloned.
    
    The stack does not build such packets. Vhost/tun skbs have their
    frags orphaned before cloning. TCP skbs only attach zerocopy state
    when a frag is added.
    
    But if TCP packets can be trimmed or linearized, this might occur.
    Tracing the code I found no instance so far (e.g., skb_linearize
    ends up calling skb_zcopy_clear if !skb->data_len).
    
    Still, it is non-obvious that no path exists. And it is fragile to
    rely on this.
    
    Fixes: b90ddd56 ("skbuff: skb_copy_ubufs must release uarg even without user frags")
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f72c4ac6
skbuff.c 133 KB