• E
    gro: ensure frag0 meets IP header alignment · 38ec4944
    Eric Dumazet 提交于
    After commit 0f6925b3 ("virtio_net: Do not pull payload in skb->head")
    Guenter Roeck reported one failure in his tests using sh architecture.
    
    After much debugging, we have been able to spot silent unaligned accesses
    in inet_gro_receive()
    
    The issue at hand is that upper networking stacks assume their header
    is word-aligned. Low level drivers are supposed to reserve NET_IP_ALIGN
    bytes before the Ethernet header to make that happen.
    
    This patch hardens skb_gro_reset_offset() to not allow frag0 fast-path
    if the fragment is not properly aligned.
    
    Some arches like x86, arm64 and powerpc do not care and define NET_IP_ALIGN
    as 0, this extra check will be a NOP for them.
    
    Note that if frag0 is not used, GRO will call pskb_may_pull()
    as many times as needed to pull network and transport headers.
    
    Fixes: 0f6925b3 ("virtio_net: Do not pull payload in skb->head")
    Fixes: 78a478d0 ("gro: Inline skb_gro_header and cache frag0 virtual address")
    Signed-off-by: NEric Dumazet <edumazet@google.com>
    Reported-by: NGuenter Roeck <linux@roeck-us.net>
    Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
    Cc: "Michael S. Tsirkin" <mst@redhat.com>
    Cc: Jason Wang <jasowang@redhat.com>
    Acked-by: NMichael S. Tsirkin <mst@redhat.com>
    Tested-by: NGuenter Roeck <linux@roeck-us.net>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    38ec4944
dev.c 287.9 KB