]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ARM: OMAP2+: Fix possible memory leak in omap_hwmod_allocate_module
authorChen Tao <chentao107@huawei.com>
Fri, 19 Jun 2020 10:42:40 +0000 (18:42 +0800)
committerTony Lindgren <tony@atomide.com>
Tue, 14 Jul 2020 15:03:05 +0000 (08:03 -0700)
Fix memory leak in omap_hwmod_allocate_module not freeing in
handling error path.

Fixes: 8c87970543b17("ARM: OMAP2+: Add functions to allocate module data from device tree")
Signed-off-by: Chen Tao <chentao107@huawei.com>
Reviewed-by: Paul Walmsley <paul@pwsan.com>
[tony@atomide.com: fix call iounmap for missing regs]
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/omap_hwmod.c

index c630457bb228e70bc572942ec62b217d5127ef18..15b29a179c8adb0f693fbb5f665414e6f32c0190 100644 (file)
@@ -3435,7 +3435,7 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
                regs = ioremap(data->module_pa,
                               data->module_size);
                if (!regs)
-                       return -ENOMEM;
+                       goto out_free_sysc;
        }
 
        /*
@@ -3445,13 +3445,13 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
        if (oh->class->name && strcmp(oh->class->name, data->name)) {
                class = kmemdup(oh->class, sizeof(*oh->class), GFP_KERNEL);
                if (!class)
-                       return -ENOMEM;
+                       goto out_unmap;
        }
 
        if (list_empty(&oh->slave_ports)) {
                oi = kcalloc(1, sizeof(*oi), GFP_KERNEL);
                if (!oi)
-                       return -ENOMEM;
+                       goto out_free_class;
 
                /*
                 * Note that we assume interconnect interface clocks will be
@@ -3478,6 +3478,14 @@ static int omap_hwmod_allocate_module(struct device *dev, struct omap_hwmod *oh,
        spin_unlock_irqrestore(&oh->_lock, flags);
 
        return 0;
+
+out_free_class:
+       kfree(class);
+out_unmap:
+       iounmap(regs);
+out_free_sysc:
+       kfree(sysc);
+       return -ENOMEM;
 }
 
 static const struct omap_hwmod_reset omap24xx_reset_quirks[] = {