diff options
author | Moritz Fischer <mdf@kernel.org> | 2018-05-04 13:18:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-05-07 23:30:03 -0400 |
commit | abcd3d6fc640aff48b17900734eff134f27fdf2a (patch) | |
tree | b6d7bb613de4014751562c425a72ef1542a009a0 /drivers/net/ethernet/ni/nixge.c | |
parent | 1751eb42ddb56b1e0a28ade5c5f19b7961a6f0c2 (diff) |
net: nixge: Fix error path for obtaining mac address
Fix issue where nixge_get_nvmem_address() returns a non-NULL
return value on a failed nvmem_cell_get() that causes an invalid
access when error value encoded in pointer is dereferenced.
Furthermore ensure that buffer allocated by nvmem_cell_read()
actually gets kfreed() if the function succeeds.
Fixes commit 492caffa8a1a ("net: ethernet: nixge: Add support for
National Instruments XGE netdev")
Reported-by: Alex Williams <alex.williams@ni.com>
Signed-off-by: Moritz Fischer <mdf@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/ni/nixge.c')
-rw-r--r-- | drivers/net/ethernet/ni/nixge.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index 27364b7572fc..c41fea9253e3 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c | |||
@@ -1170,7 +1170,7 @@ static void *nixge_get_nvmem_address(struct device *dev) | |||
1170 | 1170 | ||
1171 | cell = nvmem_cell_get(dev, "address"); | 1171 | cell = nvmem_cell_get(dev, "address"); |
1172 | if (IS_ERR(cell)) | 1172 | if (IS_ERR(cell)) |
1173 | return cell; | 1173 | return NULL; |
1174 | 1174 | ||
1175 | mac = nvmem_cell_read(cell, &cell_size); | 1175 | mac = nvmem_cell_read(cell, &cell_size); |
1176 | nvmem_cell_put(cell); | 1176 | nvmem_cell_put(cell); |
@@ -1202,10 +1202,12 @@ static int nixge_probe(struct platform_device *pdev) | |||
1202 | ndev->max_mtu = NIXGE_JUMBO_MTU; | 1202 | ndev->max_mtu = NIXGE_JUMBO_MTU; |
1203 | 1203 | ||
1204 | mac_addr = nixge_get_nvmem_address(&pdev->dev); | 1204 | mac_addr = nixge_get_nvmem_address(&pdev->dev); |
1205 | if (mac_addr && is_valid_ether_addr(mac_addr)) | 1205 | if (mac_addr && is_valid_ether_addr(mac_addr)) { |
1206 | ether_addr_copy(ndev->dev_addr, mac_addr); | 1206 | ether_addr_copy(ndev->dev_addr, mac_addr); |
1207 | else | 1207 | kfree(mac_addr); |
1208 | } else { | ||
1208 | eth_hw_addr_random(ndev); | 1209 | eth_hw_addr_random(ndev); |
1210 | } | ||
1209 | 1211 | ||
1210 | priv = netdev_priv(ndev); | 1212 | priv = netdev_priv(ndev); |
1211 | priv->ndev = ndev; | 1213 | priv->ndev = ndev; |