Skip to content
  • Willem de Bruijn's avatar
    sock: correct sk_wmem_queued accounting on efault in tcp zerocopy · 54d43117
    Willem de Bruijn authored
    Syzkaller hits WARN_ON(sk->sk_wmem_queued) in sk_stream_kill_queues
    after triggering an EFAULT in __zerocopy_sg_from_iter.
    
    On this error, skb_zerocopy_stream_iter resets the skb to its state
    before the operation with __pskb_trim. It cannot kfree_skb like
    datagram callers, as the skb may have data from a previous send call.
    
    __pskb_trim calls skb_condense for unowned skbs, which adjusts their
    truesize. These tcp skbuffs are owned and their truesize must add up
    to sk_wmem_queued. But they match because their skb->sk is NULL until
    tcp_transmit_skb.
    
    Temporarily set skb->sk when calling __pskb_trim to signal that the
    skbuffs are owned and avoid the skb_condense path.
    
    Fixes: 52267790
    
     ("sock: add MSG_ZEROCOPY")
    Signed-off-by: default avatarWillem de Bruijn <willemb@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    54d43117