Commit a6df95ca authored by John Efstathiades's avatar John Efstathiades Committed by David S. Miller
Browse files

lan78xx: Fix memory allocation bug



Fix memory allocation that fails to check for NULL return.

Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d091ec97
Loading
Loading
Loading
Loading
+21 −17
Original line number Diff line number Diff line
@@ -4106,26 +4106,28 @@ 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) {
	if (!buf) {
		ret = -ENOMEM;
		goto out3;
	}

	dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL);
	if (!dev->urb_intr) {
		ret = -ENOMEM;
			kfree(buf);
			goto out3;
		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);

	/* Reject broken descriptors. */
	if (dev->maxpacket == 0) {
		ret = -ENODEV;
		goto out4;
		goto out5;
	}

	/* driver requires remote-wakeup capability during autosuspend. */
@@ -4133,12 +4135,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);
@@ -4153,10 +4155,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: