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

Commit a7c8d2f3 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

video: imsttfb: check for ioremap() failures



commit 13b7c0390a5d3840e1e2cda8f44a310fdbb982de upstream.

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: default avatarRob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20210503115736.2104747-68-gregkh@linuxfoundation.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f042d80a
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -1469,6 +1469,7 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	struct imstt_par *par;
	struct fb_info *info;
	struct device_node *dp;
	int ret = -ENOMEM;
	
	dp = pci_device_to_OF_node(pdev);
	if(dp)
@@ -1504,23 +1505,37 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
		default:
			printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
					 "contact maintainer.\n", pdev->device);
			release_mem_region(addr, size);
			framebuffer_release(info);
			return -ENODEV;
			ret = -ENODEV;
			goto error;
	}

	info->fix.smem_start = addr;
	info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
					    0x400000 : 0x800000);
	if (!info->screen_base)
		goto error;
	info->fix.mmio_start = addr + 0x800000;
	par->dc_regs = ioremap(addr + 0x800000, 0x1000);
	if (!par->dc_regs)
		goto error;
	par->cmap_regs_phys = addr + 0x840000;
	par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
	if (!par->cmap_regs)
		goto error;
	info->pseudo_palette = par->palette;
	init_imstt(info);

	pci_set_drvdata(pdev, info);
	return 0;

error:
	if (par->dc_regs)
		iounmap(par->dc_regs);
	if (info->screen_base)
		iounmap(info->screen_base);
	release_mem_region(addr, size);
	framebuffer_release(info);
	return ret;
}

static void imsttfb_remove(struct pci_dev *pdev)