summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorBingKun Yue <yuebingkun@kylinos.cn>2026-08-17 14:39:42 +0800
committerHelge Deller <deller@gmx.de>2026-08-20 23:45:07 +0200
commitba13226fc966004713aed47931db8922b84d1960 (patch)
tree876285f76821e0a08d3ecd11bcda954f5dc722aa /drivers/video/fbdev
parent772bd1a84288e07d2621108473c96602c3d6b6bb (diff)
fbdev: platinumfb: add error checking for ioremap calls
The ioremap() and ioremap_wt() calls in platinumfb_probe() were not checked for failure. If any of these mappings fail, the driver would dereference NULL pointers, leading to a kernel panic. Add proper error checking and use goto-based cleanup to avoid code duplication across the error paths. Signed-off-by: BingKun Yue <yuebingkun@kylinos.cn> Signed-off-by: Helge Deller <deller@gmx.de>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/platinumfb.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/drivers/video/fbdev/platinumfb.c b/drivers/video/fbdev/platinumfb.c
index a08d955d9b43..81fdaa3541db 100644
--- a/drivers/video/fbdev/platinumfb.c
+++ b/drivers/video/fbdev/platinumfb.c
@@ -567,15 +567,30 @@ static int platinumfb_probe(struct platform_device* odev)
/* frame buffer - map only 4MB */
pinfo->frame_buffer_phys = pinfo->rsrc_fb.start;
pinfo->frame_buffer = ioremap_wt(pinfo->rsrc_fb.start, 0x400000);
+ if (!pinfo->frame_buffer) {
+ dev_err(&odev->dev, "failed to ioremap frame buffer\n");
+ rc = -ENOMEM;
+ goto err_release_fb;
+ }
pinfo->base_frame_buffer = pinfo->frame_buffer;
/* registers */
pinfo->platinum_regs_phys = pinfo->rsrc_reg.start;
pinfo->platinum_regs = ioremap(pinfo->rsrc_reg.start, 0x1000);
+ if (!pinfo->platinum_regs) {
+ dev_err(&odev->dev, "failed to ioremap registers\n");
+ rc = -ENOMEM;
+ goto err_unmap_fb;
+ }
pinfo->cmap_regs_phys = 0xf301b000; /* XXX not in prom? */
request_mem_region(pinfo->cmap_regs_phys, 0x1000, "platinumfb cmap");
pinfo->cmap_regs = ioremap(pinfo->cmap_regs_phys, 0x1000);
+ if (!pinfo->cmap_regs) {
+ dev_err(&odev->dev, "failed to ioremap cmap registers\n");
+ rc = -ENOMEM;
+ goto err_release_cmap;
+ }
/* Grok total video ram */
out_be32(&pinfo->platinum_regs->reg[16].r, (unsigned)pinfo->frame_buffer_phys);
@@ -623,13 +638,21 @@ static int platinumfb_probe(struct platform_device* odev)
dev_set_drvdata(&odev->dev, info);
rc = platinum_init_fb(info);
- if (rc != 0) {
- iounmap(pinfo->frame_buffer);
- iounmap(pinfo->platinum_regs);
- iounmap(pinfo->cmap_regs);
- framebuffer_release(info);
- }
+ if (rc != 0)
+ goto err_unmap_cmap;
+
+ return 0;
+err_unmap_cmap:
+ iounmap(pinfo->cmap_regs);
+err_release_cmap:
+ release_mem_region(pinfo->cmap_regs_phys, 0x1000);
+ iounmap(pinfo->platinum_regs);
+err_unmap_fb:
+ iounmap(pinfo->frame_buffer);
+err_release_fb:
+ release_mem_region(pinfo->rsrc_fb.start, resource_size(&pinfo->rsrc_fb));
+ framebuffer_release(info);
return rc;
}