lkml.org 
[lkml]   [2017]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 068/100] bnxt_en: Fix NULL pointer dereference in reopen failure path
    Date
    From: Sankar Patchineelam <sankar.patchineelam@broadcom.com>

    [ Upstream commit 2247925f0942dc4e7c09b1cde45ca18461d94c5f ]

    Net device reset can fail when the h/w or f/w is in a bad state.
    Subsequent netdevice open fails in bnxt_hwrm_stat_ctx_alloc().
    The cleanup invokes bnxt_hwrm_resource_free() which inturn
    calls bnxt_disable_int(). In this routine, the code segment

    if (ring->fw_ring_id != INVALID_HW_RING_ID)
    BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);

    results in NULL pointer dereference as cpr->cp_doorbell is not yet
    initialized, and fw_ring_id is zero.

    The fix is to initialize cpr fw_ring_id to INVALID_HW_RING_ID before
    bnxt_init_chip() is invoked.

    Signed-off-by: Sankar Patchineelam <sankar.patchineelam@broadcom.com>
    Signed-off-by: Michael Chan <michael.chan@broadcom.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    drivers/net/ethernet/broadcom/bnxt/bnxt.c | 13 +++++++++++++
    1 file changed, 13 insertions(+)

    diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    index 5d2cf56aed0e..fffc8cafe4ba 100644
    --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
    @@ -2381,6 +2381,18 @@ static int bnxt_init_one_rx_ring(struct bnxt *bp, int ring_nr)
    return 0;
    }

    +static void bnxt_init_cp_rings(struct bnxt *bp)
    +{
    + int i;
    +
    + for (i = 0; i < bp->cp_nr_rings; i++) {
    + struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
    + struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
    +
    + ring->fw_ring_id = INVALID_HW_RING_ID;
    + }
    +}
    +
    static int bnxt_init_rx_rings(struct bnxt *bp)
    {
    int i, rc = 0;
    @@ -4700,6 +4712,7 @@ static int bnxt_shutdown_nic(struct bnxt *bp, bool irq_re_init)

    static int bnxt_init_nic(struct bnxt *bp, bool irq_re_init)
    {
    + bnxt_init_cp_rings(bp);
    bnxt_init_rx_rings(bp);
    bnxt_init_tx_rings(bp);
    bnxt_init_ring_grps(bp, irq_re_init);
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-13 03:38    [W:3.308 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site