lan78xx: Fix memory leaks [Linux 4.14.143]

This Linux kernel change "lan78xx: Fix memory leaks" is included in the Linux 4.14.143 release. This change is authored by Wenwen Wang <wenwen [at] cs.uga.edu> on Wed Aug 14 11:23:13 2019 -0500. The commit for this change in Linux stable tree is c62760f (patch) which is from upstream commit b9cbf8a. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream b9cbf8a.

lan78xx: Fix memory leaks

[ Upstream commit b9cbf8a64865b50fd0f4a3915fa00ac7365cdf8f ]

In lan78xx_probe(), a new urb is allocated through usb_alloc_urb() and
saved to 'dev->urb_intr'. However, in the following execution, if an error
occurs, 'dev->urb_intr' is not deallocated, leading to memory leaks. To fix
this issue, invoke usb_free_urb() to free the allocated urb before
returning from the function.

Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>

There are 8 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/net/usb/lan78xx.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index b62c411..24b994c 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -3645,7 +3645,7 @@ static int lan78xx_probe(struct usb_interface *intf,
    ret = register_netdev(netdev);
    if (ret != 0) {
        netif_err(dev, probe, netdev, "couldn't register the device\n");
-       goto out3;
+       goto out4;
    }

    usb_set_intfdata(intf, dev);
@@ -3660,12 +3660,14 @@ static int lan78xx_probe(struct usb_interface *intf,

    ret = lan78xx_phy_init(dev);
    if (ret < 0)
-       goto out4;
+       goto out5;

    return 0;

-out4:
+out5:
    unregister_netdev(netdev);
+out4:
+   usb_free_urb(dev->urb_intr);
 out3:
    lan78xx_unbind(dev, intf);
 out2:

Leave a Reply

Your email address will not be published. Required fields are marked *