mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
net: enetc: unmap DMA in enetc_send_cmd()
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: 888ae5a395
("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>
This commit is contained in:
parent
5b92be6496
commit
cd4bc63de7
1 changed files with 11 additions and 7 deletions
|
@ -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] = cpu_to_le32(lower_32_bits(dma));
|
||||
|
@ -512,12 +514,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));
|
||||
|
@ -560,6 +560,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;
|
||||
|
|
Loading…
Add table
Reference in a new issue