lkml.org 
[lkml]   [2021]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 132/146] net: ll_temac: Make sure to free skb when it is completely used
    Date
    From: Esben Haabendal <esben@geanix.com>

    commit 6aa32217a9a446275440ee8724b1ecaf1838df47 upstream.

    With the skb pointer piggy-backed on the TX BD, we have a simple and
    efficient way to free the skb buffer when the frame has been transmitted.
    But in order to avoid freeing the skb while there are still fragments from
    the skb in use, we need to piggy-back on the TX BD of the skb, not the
    first.

    Without this, we are doing use-after-free on the DMA side, when the first
    BD of a multi TX BD packet is seen as completed in xmit_done, and the
    remaining BDs are still being processed.

    Cc: stable@vger.kernel.org # v5.4+
    Signed-off-by: Esben Haabendal <esben@geanix.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/xilinx/ll_temac_main.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/drivers/net/ethernet/xilinx/ll_temac_main.c
    +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c
    @@ -876,7 +876,6 @@ temac_start_xmit(struct sk_buff *skb, st
    return NETDEV_TX_OK;
    }
    cur_p->phys = cpu_to_be32(skb_dma_addr);
    - ptr_to_txbd((void *)skb, cur_p);

    for (ii = 0; ii < num_frag; ii++) {
    if (++lp->tx_bd_tail >= lp->tx_bd_num)
    @@ -915,6 +914,11 @@ temac_start_xmit(struct sk_buff *skb, st
    }
    cur_p->app0 |= cpu_to_be32(STS_CTRL_APP0_EOP);

    + /* Mark last fragment with skb address, so it can be consumed
    + * in temac_start_xmit_done()
    + */
    + ptr_to_txbd((void *)skb, cur_p);
    +
    tail_p = lp->tx_bd_p + sizeof(*lp->tx_bd_v) * lp->tx_bd_tail;
    lp->tx_bd_tail++;
    if (lp->tx_bd_tail >= lp->tx_bd_num)

    \
     
     \ /
      Last update: 2021-06-21 18:36    [W:4.176 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site