• Eric Dumazet's avatar
    qlcnic: dont assume NET_IP_ALIGN is 2 · 04746ff1
    Eric Dumazet authored
    qlcnic driver allocates rx skbs and gives to hardware too bytes of extra
    storage, allowing for corruption of kernel data.
    
    NET_IP_ALIGN being 0 on some platforms (including x86), drivers should
    not assume it's 2.
    
    rds_ring->skb_size = rds_ring->dma_size + NET_IP_ALIGN;
    ...
    skb = dev_alloc_skb(rds_ring->skb_size);
    skb_reserve(skb, 2);
    pci_map_single(pdev, skb->data, rds_ring->dma_size, PCI_DMA_FROMDEVICE);
    
    (and rds_ring->skb_size == rds_ring->dma_size) -> bug
    
    
    Because of extra alignment (1500 + 32) -> four extra bytes are available
    before the struct skb_shared_info, so corruption is not noticed.
    
    Note: this driver could use netdev_alloc_skb_ip_align()
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    04746ff1
qlcnic_init.c 41.4 KB