mfd: Fix memory leak in mfd_add_devices()
If the first call to mfd_add_device() fails, no child devices have been registered to the parent yet, and thus mfd_remove_devices() won't find anything to remove nor free. Hence the previously allocated array of atomic_t objects will leak. Free the array instead of calling mfd_remove_devices() on failure during the first loop iteration to fix this. Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
parent
03e361b25e
commit
0b208e41ac
|
@ -187,7 +187,7 @@ int mfd_add_devices(struct device *parent, int id,
|
||||||
int irq_base, struct irq_domain *domain)
|
int irq_base, struct irq_domain *domain)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int ret = 0;
|
int ret;
|
||||||
atomic_t *cnts;
|
atomic_t *cnts;
|
||||||
|
|
||||||
/* initialize reference counting for all cells */
|
/* initialize reference counting for all cells */
|
||||||
|
@ -200,12 +200,16 @@ int mfd_add_devices(struct device *parent, int id,
|
||||||
ret = mfd_add_device(parent, id, cells + i, cnts + i, mem_base,
|
ret = mfd_add_device(parent, id, cells + i, cnts + i, mem_base,
|
||||||
irq_base, domain);
|
irq_base, domain);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret)
|
return 0;
|
||||||
mfd_remove_devices(parent);
|
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (i)
|
||||||
|
mfd_remove_devices(parent);
|
||||||
|
else
|
||||||
|
kfree(cnts);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mfd_add_devices);
|
EXPORT_SYMBOL(mfd_add_devices);
|
||||||
|
|
Loading…
Reference in New Issue