Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

video: imsttfb: check for ioremap() failures

We should check if ioremap() were to somehow fail in imsttfb_probe() and
handle the unwinding of the resources allocated here properly.

Ideally if anyone cares about this driver (it's for a PowerMac era PCI
display card), they wouldn't even be using fbdev anymore. Or the devm_*
apis could be used, but that's just extra work for diminishing
returns...

Cc: Finn Thain <fthain@telegraphics.com.au>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20210503115736.2104747-68-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

+18 -3
+18 -3
drivers/video/fbdev/imsttfb.c
··· 1469 1469 struct imstt_par *par; 1470 1470 struct fb_info *info; 1471 1471 struct device_node *dp; 1472 + int ret = -ENOMEM; 1472 1473 1473 1474 dp = pci_device_to_OF_node(pdev); 1474 1475 if(dp) ··· 1505 1504 default: 1506 1505 printk(KERN_INFO "imsttfb: Device 0x%x unknown, " 1507 1506 "contact maintainer.\n", pdev->device); 1508 - release_mem_region(addr, size); 1509 - framebuffer_release(info); 1510 - return -ENODEV; 1507 + ret = -ENODEV; 1508 + goto error; 1511 1509 } 1512 1510 1513 1511 info->fix.smem_start = addr; 1514 1512 info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ? 1515 1513 0x400000 : 0x800000); 1514 + if (!info->screen_base) 1515 + goto error; 1516 1516 info->fix.mmio_start = addr + 0x800000; 1517 1517 par->dc_regs = ioremap(addr + 0x800000, 0x1000); 1518 + if (!par->dc_regs) 1519 + goto error; 1518 1520 par->cmap_regs_phys = addr + 0x840000; 1519 1521 par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000); 1522 + if (!par->cmap_regs) 1523 + goto error; 1520 1524 info->pseudo_palette = par->palette; 1521 1525 init_imstt(info); 1522 1526 1523 1527 pci_set_drvdata(pdev, info); 1524 1528 return 0; 1529 + 1530 + error: 1531 + if (par->dc_regs) 1532 + iounmap(par->dc_regs); 1533 + if (info->screen_base) 1534 + iounmap(info->screen_base); 1535 + release_mem_region(addr, size); 1536 + framebuffer_release(info); 1537 + return ret; 1525 1538 } 1526 1539 1527 1540 static void imsttfb_remove(struct pci_dev *pdev)