Commit 0b208e41 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Lee Jones

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: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent 03e361b2
...@@ -187,7 +187,7 @@ int mfd_add_devices(struct device *parent, int id, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment