On Thu, Oct 19, 2017 at 9:40 AM, Willem de Bruijn <willemdebruijn.ker...@gmail.com> wrote: > From: Willem de Bruijn <will...@google.com> > > 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: 52267790ef52 ("sock: add MSG_ZEROCOPY") > Signed-off-by: Willem de Bruijn <will...@google.com>
Reviewed-by: Eric Dumazet <eduma...@google.com> Thanks a lot Willem.