Skip to content

Commit aba6ab5

Browse files
Dan Carpenterhdeller
authored andcommitted
fbdev: imsttfb: fix a resource leak in probe
I've re-written the error handling but the bug is that if init_imstt() fails we need to call iounmap(par->cmap_regs). Fixes: c75f5a5 ("fbdev: imsttfb: Fix use after free bug in imsttfb_probe") Signed-off-by: Dan Carpenter <[email protected]> Signed-off-by: Helge Deller <[email protected]>
1 parent e08c30e commit aba6ab5

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

drivers/video/fbdev/imsttfb.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,8 +1496,8 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
14961496

14971497
if (!request_mem_region(addr, size, "imsttfb")) {
14981498
printk(KERN_ERR "imsttfb: Can't reserve memory region\n");
1499-
framebuffer_release(info);
1500-
return -ENODEV;
1499+
ret = -ENODEV;
1500+
goto release_info;
15011501
}
15021502

15031503
switch (pdev->device) {
@@ -1514,36 +1514,39 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
15141514
printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
15151515
"contact maintainer.\n", pdev->device);
15161516
ret = -ENODEV;
1517-
goto error;
1517+
goto release_mem_region;
15181518
}
15191519

15201520
info->fix.smem_start = addr;
15211521
info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
15221522
0x400000 : 0x800000);
15231523
if (!info->screen_base)
1524-
goto error;
1524+
goto release_mem_region;
15251525
info->fix.mmio_start = addr + 0x800000;
15261526
par->dc_regs = ioremap(addr + 0x800000, 0x1000);
15271527
if (!par->dc_regs)
1528-
goto error;
1528+
goto unmap_screen_base;
15291529
par->cmap_regs_phys = addr + 0x840000;
15301530
par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
15311531
if (!par->cmap_regs)
1532-
goto error;
1532+
goto unmap_dc_regs;
15331533
info->pseudo_palette = par->palette;
15341534
ret = init_imstt(info);
15351535
if (ret)
1536-
goto error;
1536+
goto unmap_cmap_regs;
15371537

15381538
pci_set_drvdata(pdev, info);
1539-
return ret;
1539+
return 0;
15401540

1541-
error:
1542-
if (par->dc_regs)
1543-
iounmap(par->dc_regs);
1544-
if (info->screen_base)
1545-
iounmap(info->screen_base);
1541+
unmap_cmap_regs:
1542+
iounmap(par->cmap_regs);
1543+
unmap_dc_regs:
1544+
iounmap(par->dc_regs);
1545+
unmap_screen_base:
1546+
iounmap(info->screen_base);
1547+
release_mem_region:
15461548
release_mem_region(addr, size);
1549+
release_info:
15471550
framebuffer_release(info);
15481551
return ret;
15491552
}

0 commit comments

Comments
 (0)