lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 339/575] net: enetc: unmap DMA in enetc_send_cmd()
    Date
    From: Tim Gardner <tim.gardner@canonical.com>

    [ Upstream commit cd4bc63de774eee95e9bac26a565cd80e0fca421 ]

    Coverity complains of a possible dereference of a null return value.

    5. returned_null: kzalloc returns NULL. [show details]
    6. var_assigned: Assigning: si_data = NULL return value from kzalloc.
    488 si_data = kzalloc(data_size, __GFP_DMA | GFP_KERNEL);
    489 cbd.length = cpu_to_le16(data_size);
    490
    491 dma = dma_map_single(&priv->si->pdev->dev, si_data,
    492 data_size, DMA_FROM_DEVICE);

    While this kzalloc() is unlikely to fail, I did notice that the function
    returned without unmapping si_data.

    Fix this by refactoring the error paths and checking for kzalloc()
    failure.

    Fixes: 888ae5a3952ba ("net: enetc: add tc flower psfp offload driver")
    Cc: Claudiu Manoil <claudiu.manoil@nxp.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: netdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org (open list)
    Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
    Acked-by: Claudiu Manoil <claudiu.manoil@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../net/ethernet/freescale/enetc/enetc_qos.c | 18 +++++++++++-------
    1 file changed, 11 insertions(+), 7 deletions(-)

    diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    index dbceb99c4441a..9e6988fd3787a 100644
    --- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    +++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
    @@ -486,14 +486,16 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,

    data_size = sizeof(struct streamid_data);
    si_data = kzalloc(data_size, __GFP_DMA | GFP_KERNEL);
    + if (!si_data)
    + return -ENOMEM;
    cbd.length = cpu_to_le16(data_size);

    dma = dma_map_single(&priv->si->pdev->dev, si_data,
    data_size, DMA_FROM_DEVICE);
    if (dma_mapping_error(&priv->si->pdev->dev, dma)) {
    netdev_err(priv->si->ndev, "DMA mapping failed!\n");
    - kfree(si_data);
    - return -ENOMEM;
    + err = -ENOMEM;
    + goto out;
    }

    cbd.addr[0] = lower_32_bits(dma);
    @@ -513,12 +515,10 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,

    err = enetc_send_cmd(priv->si, &cbd);
    if (err)
    - return -EINVAL;
    + goto out;

    - if (!enable) {
    - kfree(si_data);
    - return 0;
    - }
    + if (!enable)
    + goto out;

    /* Enable the entry overwrite again incase space flushed by hardware */
    memset(&cbd, 0, sizeof(cbd));
    @@ -563,6 +563,10 @@ static int enetc_streamid_hw_set(struct enetc_ndev_priv *priv,
    }

    err = enetc_send_cmd(priv->si, &cbd);
    +out:
    + if (!dma_mapping_error(&priv->si->pdev->dev, dma))
    + dma_unmap_single(&priv->si->pdev->dev, dma, data_size, DMA_FROM_DEVICE);
    +
    kfree(si_data);

    return err;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 21:23    [W:4.017 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site