Skip to content

Commit a6df95c

Browse files
jefstathdavem330
authored andcommitted
lan78xx: Fix memory allocation bug
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>
1 parent d091ec9 commit a6df95c

File tree

1 file changed

+21
-17
lines changed

1 file changed

+21
-17
lines changed

drivers/net/usb/lan78xx.c

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4106,39 +4106,41 @@ static int lan78xx_probe(struct usb_interface *intf,
41064106
period = ep_intr->desc.bInterval;
41074107
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
41084108
buf = kmalloc(maxp, GFP_KERNEL);
4109-
if (buf) {
4110-
dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL);
4111-
if (!dev->urb_intr) {
4112-
ret = -ENOMEM;
4113-
kfree(buf);
4114-
goto out3;
4115-
} else {
4116-
usb_fill_int_urb(dev->urb_intr, dev->udev,
4117-
dev->pipe_intr, buf, maxp,
4118-
intr_complete, dev, period);
4119-
dev->urb_intr->transfer_flags |= URB_FREE_BUFFER;
4120-
}
4109+
if (!buf) {
4110+
ret = -ENOMEM;
4111+
goto out3;
4112+
}
4113+
4114+
dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL);
4115+
if (!dev->urb_intr) {
4116+
ret = -ENOMEM;
4117+
goto out4;
4118+
} else {
4119+
usb_fill_int_urb(dev->urb_intr, dev->udev,
4120+
dev->pipe_intr, buf, maxp,
4121+
intr_complete, dev, period);
4122+
dev->urb_intr->transfer_flags |= URB_FREE_BUFFER;
41214123
}
41224124

41234125
dev->maxpacket = usb_maxpacket(dev->udev, dev->pipe_out, 1);
41244126

41254127
/* Reject broken descriptors. */
41264128
if (dev->maxpacket == 0) {
41274129
ret = -ENODEV;
4128-
goto out4;
4130+
goto out5;
41294131
}
41304132

41314133
/* driver requires remote-wakeup capability during autosuspend. */
41324134
intf->needs_remote_wakeup = 1;
41334135

41344136
ret = lan78xx_phy_init(dev);
41354137
if (ret < 0)
4136-
goto out4;
4138+
goto out5;
41374139

41384140
ret = register_netdev(netdev);
41394141
if (ret != 0) {
41404142
netif_err(dev, probe, netdev, "couldn't register the device\n");
4141-
goto out5;
4143+
goto out6;
41424144
}
41434145

41444146
usb_set_intfdata(intf, dev);
@@ -4153,10 +4155,12 @@ static int lan78xx_probe(struct usb_interface *intf,
41534155

41544156
return 0;
41554157

4156-
out5:
4158+
out6:
41574159
phy_disconnect(netdev->phydev);
4158-
out4:
4160+
out5:
41594161
usb_free_urb(dev->urb_intr);
4162+
out4:
4163+
kfree(buf);
41604164
out3:
41614165
lan78xx_unbind(dev, intf);
41624166
out2:

0 commit comments

Comments
 (0)