mfd: Fix memory leak in mfd_add_devices()
authorGeert Uytterhoeven <geert@linux-m68k.org>
Tue, 29 Oct 2013 14:47:22 +0000 (15:47 +0100)
committerLee Jones <lee.jones@linaro.org>
Mon, 11 Nov 2013 11:22:17 +0000 (11:22 +0000)
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>
drivers/mfd/mfd-core.c

index 8736f4539bc0a835eb0a7acbee57209012d06685..968775da638a5ded051596623b9736081bd8db52 100644 (file)
@@ -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);