net: ucc_geth: drop acquired references in probe error path and remove
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Thu, 7 Aug 2014 21:48:24 +0000 (23:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Aug 2014 23:02:59 +0000 (16:02 -0700)
The ucc_geth_probe function assigns to ug_info->tbi_node and
ug_info->phy_node a value returned by of_parse_phandle which returns a
new reference. Put this reference again in the error path of
ucc_geth_probe and when removing the device.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/ucc_geth.c

index 8ceaf7a2660c8f3f38dc27ce71701a3290ce14d2..f6b956952269a58c5e8676c4a7b63271508a5f38 100644 (file)
@@ -3862,8 +3862,11 @@ static int ucc_geth_probe(struct platform_device* ofdev)
        /* Create an ethernet device instance */
        dev = alloc_etherdev(sizeof(*ugeth));
 
-       if (dev == NULL)
+       if (dev == NULL) {
+               of_node_put(ug_info->tbi_node);
+               of_node_put(ug_info->phy_node);
                return -ENOMEM;
+       }
 
        ugeth = netdev_priv(dev);
        spin_lock_init(&ugeth->lock);
@@ -3897,6 +3900,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
                        pr_err("%s: Cannot register net device, aborting\n",
                               dev->name);
                free_netdev(dev);
+               of_node_put(ug_info->tbi_node);
+               of_node_put(ug_info->phy_node);
                return err;
        }
 
@@ -3920,6 +3925,8 @@ static int ucc_geth_remove(struct platform_device* ofdev)
        unregister_netdev(dev);
        free_netdev(dev);
        ucc_geth_memclean(ugeth);
+       of_node_put(ugeth->info->tbi_node);
+       of_node_put(ugeth->info->phy_node);
 
        return 0;
 }