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:
Geert Uytterhoeven 2013-10-29 15:47:22 +01:00 committed by Lee Jones
parent 03e361b25e
commit 0b208e41ac
1 changed files with 8 additions and 4 deletions

View File

@ -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);