• Paolo Abeni's avatar
    udp: fix poll() · 9bd780f5
    Paolo Abeni authored
    Michael reported an UDP breakage caused by the commit b65ac446
    ("udp: try to avoid 2 cache miss on dequeue").
    The function __first_packet_length() can update the checksum bits
    of the pending skb, making the scratched area out-of-sync, and
    setting skb->csum, if the skb was previously in need of checksum
    validation.
    
    On later recvmsg() for such skb, checksum validation will be
    invoked again - due to the wrong udp_skb_csum_unnecessary()
    value - and will fail, causing the valid skb to be dropped.
    
    This change addresses the issue refreshing the scratch area in
    __first_packet_length() after the possible checksum update.
    
    Fixes: b65ac446 ("udp: try to avoid 2 cache miss on dequeue")
    Reported-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9bd780f5
udp.c 72.9 KB