net: cavium: liquidio: Avoid dma_unmap_single on uninitialized ndata
commit 8e6ce7ebeb34f0992f56de078c3744fb383657fa upstream.
The label lio_xmit_failed is used 3 times through liquidio_xmit() but it
always makes a call to dma_unmap_single() using potentially
uninitialized variables from "ndata" variable. Out of the 3 gotos, 2 run
after ndata has been initialized, and had a prior dma_map_single() call.
Fix this by adding a new error label: lio_xmit_dma_failed which does
this dma_unmap_single() and then processed with the lio_xmit_failed
fallthrough.
Fixes: f21fb3ed36
("Add support of Cavium Liquidio ethernet adapters")
Reported-by: coverity (CID 1309740)
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Cc: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2907c91c9f
commit
1d1cb76252
@ -2823,7 +2823,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
if (!g) {
|
if (!g) {
|
||||||
netif_info(lio, tx_err, lio->netdev,
|
netif_info(lio, tx_err, lio->netdev,
|
||||||
"Transmit scatter gather: glist null!\n");
|
"Transmit scatter gather: glist null!\n");
|
||||||
goto lio_xmit_failed;
|
goto lio_xmit_dma_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdsetup.s.gather = 1;
|
cmdsetup.s.gather = 1;
|
||||||
@ -2894,7 +2894,7 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
else
|
else
|
||||||
status = octnet_send_nic_data_pkt(oct, &ndata, xmit_more);
|
status = octnet_send_nic_data_pkt(oct, &ndata, xmit_more);
|
||||||
if (status == IQ_SEND_FAILED)
|
if (status == IQ_SEND_FAILED)
|
||||||
goto lio_xmit_failed;
|
goto lio_xmit_dma_failed;
|
||||||
|
|
||||||
netif_info(lio, tx_queued, lio->netdev, "Transmit queued successfully\n");
|
netif_info(lio, tx_queued, lio->netdev, "Transmit queued successfully\n");
|
||||||
|
|
||||||
@ -2908,12 +2908,13 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
|
|||||||
|
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
|
|
||||||
|
lio_xmit_dma_failed:
|
||||||
|
dma_unmap_single(&oct->pci_dev->dev, ndata.cmd.dptr,
|
||||||
|
ndata.datasize, DMA_TO_DEVICE);
|
||||||
lio_xmit_failed:
|
lio_xmit_failed:
|
||||||
stats->tx_dropped++;
|
stats->tx_dropped++;
|
||||||
netif_info(lio, tx_err, lio->netdev, "IQ%d Transmit dropped:%llu\n",
|
netif_info(lio, tx_err, lio->netdev, "IQ%d Transmit dropped:%llu\n",
|
||||||
iq_no, stats->tx_dropped);
|
iq_no, stats->tx_dropped);
|
||||||
dma_unmap_single(&oct->pci_dev->dev, ndata.cmd.dptr,
|
|
||||||
ndata.datasize, DMA_TO_DEVICE);
|
|
||||||
recv_buffer_free(skb);
|
recv_buffer_free(skb);
|
||||||
return NETDEV_TX_OK;
|
return NETDEV_TX_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user