From: Markus Elfring <[email protected]>
Date: Sun, 18 Jan 2015 23:30:41 +0100

The iounmap() function could be called in two cases by the tdfxfb_probe()
function during error handling even if the passed data structure element
contained still a null pointer.

This implementation detail could be improved by adjustments for jump labels.

Signed-off-by: Markus Elfring <[email protected]>
---
 drivers/video/fbdev/tdfxfb.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/video/fbdev/tdfxfb.c b/drivers/video/fbdev/tdfxfb.c
index 69d4062..c280a3b 100644
--- a/drivers/video/fbdev/tdfxfb.c
+++ b/drivers/video/fbdev/tdfxfb.c
@@ -1438,20 +1438,20 @@ static int tdfxfb_probe(struct pci_dev *pdev, const 
struct pci_device_id *id)
        if (!default_par->regbase_virt) {
                printk(KERN_ERR "fb: Can't remap %s register area.\n",
                                info->fix.id);
-               goto out_err_regbase;
+               goto release_memory_region_regbase;
        }
 
        info->fix.smem_start = pci_resource_start(pdev, 1);
        info->fix.smem_len = do_lfb_size(default_par, pdev->device);
        if (!info->fix.smem_len) {
                printk(KERN_ERR "fb: Can't count %s memory.\n", info->fix.id);
-               goto out_err_regbase;
+               goto io_unmap_regbase;
        }
 
        if (!request_mem_region(info->fix.smem_start,
                                pci_resource_len(pdev, 1), "tdfx smem")) {
                printk(KERN_ERR "tdfxfb: Can't reserve smem\n");
-               goto out_err_regbase;
+               goto io_unmap_regbase;
        }
 
        info->screen_base = ioremap_nocache(info->fix.smem_start,
@@ -1459,7 +1459,7 @@ static int tdfxfb_probe(struct pci_dev *pdev, const 
struct pci_device_id *id)
        if (!info->screen_base) {
                printk(KERN_ERR "fb: Can't remap %s framebuffer.\n",
                                info->fix.id);
-               goto out_err_screenbase;
+               goto release_memory_region_screenbase;
        }
 
        default_par->iobase = pci_resource_start(pdev, 2);
@@ -1467,7 +1467,7 @@ static int tdfxfb_probe(struct pci_dev *pdev, const 
struct pci_device_id *id)
        if (!request_region(pci_resource_start(pdev, 2),
                            pci_resource_len(pdev, 2), "tdfx iobase")) {
                printk(KERN_ERR "tdfxfb: Can't reserve iobase\n");
-               goto out_err_screenbase;
+               goto io_unmap_screenbase;
        }
 
        printk(KERN_INFO "fb: %s memory = %dK\n", info->fix.id,
@@ -1571,14 +1571,16 @@ out_err_iobase:
                         info->fix.smem_len);
        release_region(pci_resource_start(pdev, 2),
                       pci_resource_len(pdev, 2));
-out_err_screenbase:
+io_unmap_screenbase:
        iounmap(info->screen_base);
+release_memory_region_screenbase:
        release_mem_region(info->fix.smem_start, pci_resource_len(pdev, 1));
-out_err_regbase:
+io_unmap_regbase:
        /*
         * Cleanup after anything that was remapped/allocated.
         */
        iounmap(default_par->regbase_virt);
+release_memory_region_regbase:
        release_mem_region(info->fix.mmio_start, info->fix.mmio_len);
 out_err:
        framebuffer_release(info);
-- 
2.2.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to