aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/pci/it821x.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 11:36:42 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 11:36:42 -0400
commiteb7a07e8d6580ea498cac53acafe42c080af4d06 (patch)
tree0fb5175c41825786f774247d1c759e7fb1c4ea3a /drivers/ide/pci/it821x.c
parent79472b6ea9e74ee4400ba57ba84cad86426e2d6d (diff)
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: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci/it821x.c')
-rw-r--r--drivers/ide/pci/it821x.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
index b9f9e0d78f84..a38ec47423a0 100644
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -523,16 +523,12 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive)
523static void __devinit init_hwif_it821x(ide_hwif_t *hwif) 523static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
524{ 524{
525 struct pci_dev *dev = to_pci_dev(hwif->dev); 525 struct pci_dev *dev = to_pci_dev(hwif->dev);
526 struct it821x_dev *idev = kzalloc(sizeof(struct it821x_dev), GFP_KERNEL); 526 struct it821x_dev **itdevs = (struct it821x_dev **)pci_get_drvdata(dev);
527 struct it821x_dev *idev = itdevs[hwif->channel];
527 u8 conf; 528 u8 conf;
528 529
529 hwif->quirkproc = &it821x_quirkproc; 530 hwif->quirkproc = &it821x_quirkproc;
530 531
531 if (idev == NULL) {
532 printk(KERN_ERR "it821x: out of memory, falling back to legacy behaviour.\n");
533 return;
534 }
535
536 ide_set_hwifdata(hwif, idev); 532 ide_set_hwifdata(hwif, idev);
537 533
538 pci_read_config_byte(dev, 0x50, &conf); 534 pci_read_config_byte(dev, 0x50, &conf);
@@ -641,6 +637,22 @@ static const struct ide_port_info it821x_chipsets[] __devinitdata = {
641 637
642static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id) 638static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
643{ 639{
640 struct it821x_dev *itdevs[2] = { NULL, NULL} , *itdev;
641 unsigned int i;
642
643 for (i = 0; i < 2; i++) {
644 itdev = kzalloc(sizeof(*itdev), GFP_KERNEL);
645 if (itdev == NULL) {
646 kfree(itdevs[0]);
647 printk(KERN_ERR "it821x: out of memory\n");
648 return -ENOMEM;
649 }
650
651 itdevs[i] = itdev;
652 }
653
654 pci_set_drvdata(dev, itdevs);
655
644 return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]); 656 return ide_setup_pci_device(dev, &it821x_chipsets[id->driver_data]);
645} 657}
646 658