| From 22598bd1e548e944b88d59d14a64658ec32b912d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 18 Nov 2021 11:01:34 +0000 |
| Subject: lan78xx: Fix memory allocation bug |
| |
| From: John Efstathiades <john.efstathiades@pebblebay.com> |
| |
| [ Upstream commit a6df95cae40bee555e01a37b4023ce8e97ffa249 ] |
| |
| Fix memory allocation that fails to check for NULL return. |
| |
| Signed-off-by: John Efstathiades <john.efstathiades@pebblebay.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Stable-dep-of: f1e2f0ce704e ("net: usb: lan78xx: scan all MDIO addresses on LAN7801") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/usb/lan78xx.c | 38 +++++++++++++++++++++----------------- |
| 1 file changed, 21 insertions(+), 17 deletions(-) |
| |
| diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c |
| index d7539ec84ea63..dbb41c22ed7eb 100644 |
| --- a/drivers/net/usb/lan78xx.c |
| +++ b/drivers/net/usb/lan78xx.c |
| @@ -4054,18 +4054,20 @@ static int lan78xx_probe(struct usb_interface *intf, |
| period = ep_intr->desc.bInterval; |
| maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0); |
| buf = kmalloc(maxp, GFP_KERNEL); |
| - if (buf) { |
| - dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL); |
| - if (!dev->urb_intr) { |
| - ret = -ENOMEM; |
| - kfree(buf); |
| - goto out3; |
| - } else { |
| - usb_fill_int_urb(dev->urb_intr, dev->udev, |
| - dev->pipe_intr, buf, maxp, |
| - intr_complete, dev, period); |
| - dev->urb_intr->transfer_flags |= URB_FREE_BUFFER; |
| - } |
| + if (!buf) { |
| + ret = -ENOMEM; |
| + goto out3; |
| + } |
| + |
| + dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL); |
| + if (!dev->urb_intr) { |
| + ret = -ENOMEM; |
| + goto out4; |
| + } else { |
| + usb_fill_int_urb(dev->urb_intr, dev->udev, |
| + dev->pipe_intr, buf, maxp, |
| + intr_complete, dev, period); |
| + dev->urb_intr->transfer_flags |= URB_FREE_BUFFER; |
| } |
| |
| dev->maxpacket = usb_maxpacket(dev->udev, dev->pipe_out, 1); |
| @@ -4073,7 +4075,7 @@ static int lan78xx_probe(struct usb_interface *intf, |
| /* Reject broken descriptors. */ |
| if (dev->maxpacket == 0) { |
| ret = -ENODEV; |
| - goto out4; |
| + goto out5; |
| } |
| |
| /* driver requires remote-wakeup capability during autosuspend. */ |
| @@ -4081,12 +4083,12 @@ static int lan78xx_probe(struct usb_interface *intf, |
| |
| ret = lan78xx_phy_init(dev); |
| if (ret < 0) |
| - goto out4; |
| + goto out5; |
| |
| ret = register_netdev(netdev); |
| if (ret != 0) { |
| netif_err(dev, probe, netdev, "couldn't register the device\n"); |
| - goto out5; |
| + goto out6; |
| } |
| |
| usb_set_intfdata(intf, dev); |
| @@ -4101,10 +4103,12 @@ static int lan78xx_probe(struct usb_interface *intf, |
| |
| return 0; |
| |
| -out5: |
| +out6: |
| phy_disconnect(netdev->phydev); |
| -out4: |
| +out5: |
| usb_free_urb(dev->urb_intr); |
| +out4: |
| + kfree(buf); |
| out3: |
| lan78xx_unbind(dev, intf); |
| out2: |
| -- |
| 2.51.0 |
| |