Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb7a07e8 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

it821x: fix kzalloc() failure handling



Allocate 'struct it821x_dev' objects for both ports in it821x_init_one().

Fixes potential OOPS in it821x_quirkproc() (uses 'itdev' unconditionally)
and other problems ('itdev' is needed for correct operation of the driver).

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 79472b6e
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -523,16 +523,12 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive)
static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
{
	struct pci_dev *dev = to_pci_dev(hwif->dev);
	struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL);
	struct it821x_dev **itdevs = (struct it821x_dev **)pci_get_drvdata(dev);
	struct it821x_dev *idev = itdevs[hwif->channel];
	u8 conf;

	hwif->quirkproc = &it821x_quirkproc;

	if (idev == NULL) {
		printk(KERN_ERR "it821x: out of memory, falling back to legacy behaviour.\n");
		return;
	}

	ide_set_hwifdata(hwif, idev);

	pci_read_config_byte(dev, 0x50, &conf);
@@ -641,6 +637,22 @@ static const struct ide_port_info it821x_chipsets[] __devinitdata = {

static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
	struct it821x_dev *itdevs[2] = { NULL, NULL} , *itdev;
	unsigned int i;

	for (i = 0; i < 2; i++) {
		itdev = kzalloc(sizeof(*itdev), GFP_KERNEL);
		if (itdev == NULL) {
			kfree(itdevs[0]);
			printk(KERN_ERR "it821x: out of memory\n");
			return -ENOMEM;
		}

		itdevs[i] = itdev;
	}

	pci_set_drvdata(dev, itdevs);

	return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]);
}