• Ben Hutchings's avatar
    net: qlogic: Fix error paths in ql_alloc_large_buffers() · cad46039
    Ben Hutchings authored
    ql_alloc_large_buffers() has the usual RX buffer allocation
    loop where it allocates skbs and maps them for DMA.  It also
    treats failure as a fatal error.
    
    There are (at least) three bugs in the error paths:
    
    1. ql_free_large_buffers() assumes that the lrg_buf[] entry for the
    first buffer that couldn't be allocated will have .skb == NULL.
    But the qla_buf[] array is not zero-initialised.
    
    2. ql_free_large_buffers() DMA-unmaps all skbs in lrg_buf[].  This is
    incorrect for the last allocated skb, if DMA mapping failed.
    
    3. Commit 1acb8f2a ("net: qlogic: Fix memory leak in
    ql_alloc_large_buffers") added a direct call to dev_kfree_skb_any()
    after the skb is recorded in lrg_buf[], so ql_free_large_buffers()
    will double-free it.
    
    The bugs are somewhat inter-twined, so fix them all at once:
    
    * Clear each entry in qla_buf[] before attempting to allocate
      an skb for it.  This goes half-way to fixing bug 1.
    * Set the .skb field only after the skb is DMA-mapped.  This
      fixes the rest.
    
    Fixes: 1357bfcf ("qla3xxx: Dynamically size the rx buffer queue ...")
    Fixes: 0f8ab89e ("qla3xxx: Check return code from pci_map_single() ...")
    Fixes: 1acb8f2a ("net: qlogic: Fix memory leak in ql_alloc_large_buffers")
    Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cad46039
qla3xxx.c 101 KB