Commit a18fb076 authored by Chen Tao's avatar Chen Tao Committed by Tony Lindgren
Browse files

ARM: OMAP2+: Fix possible memory leak in omap_hwmod_allocate_module



Fix memory leak in omap_hwmod_allocate_module not freeing in
handling error path.

Fixes: 8c879705("ARM: OMAP2+: Add functions to allocate module data from device tree")
Signed-off-by: default avatarChen Tao <chentao107@huawei.com>
Reviewed-by: default avatarPaul Walmsley <paul@pwsan.com>
[tony@atomide.com: fix call iounmap for missing regs]
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent a55de412
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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[] = {