提交 0b208e41 编写于 作者: G Geert Uytterhoeven 提交者: 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: NGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: NLee Jones <lee.jones@linaro.org>
上级 03e361b2
......@@ -187,7 +187,7 @@ int mfd_add_devices(struct device *parent, int id,
int irq_base, struct irq_domain *domain)
{
int i;
int ret = 0;
int ret;
atomic_t *cnts;
/* 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,
irq_base, domain);
if (ret)
break;
goto fail;
}
if (ret)
mfd_remove_devices(parent);
return 0;
fail:
if (i)
mfd_remove_devices(parent);
else
kfree(cnts);
return ret;
}
EXPORT_SYMBOL(mfd_add_devices);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册